updates.
[silc.git] / CHANGES
diff --git a/CHANGES b/CHANGES
index cae450b341d3ea69df32f65507dd15c8fd5cb2b2..47f3c148a4db95c6c1df3682ec353ac7120a527d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
-Fri Oct  5 21:16:28 EEST 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+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
+         whether the requested user and group actually exists.
+
+       * Added sanity check to SKE's silc_ske_responder_finish to check
+         that the public and private key actually is valid. 
+
+       * Invalidate the client's nickname when receiving Replace ID
+         packet and the Client ID is being replaced.  This means that the
+         server will query the nickname if someone needs it (client)
+         a bit later.
+
+       * Sort the ID Cache in client library when the ID Cache data
+         has changed (needs sorting).
+
+       * Do not allow for SILC client to create several connections to
+         several servers.  The client does not support windows right now
+         and generating multiple connections causes weird behaviour.
+
+         Irssi-silc client does support windows and can handle several
+         connections without problems, see: www.irssi.org and SILC plugin.
+
+       * Fixed some places where client was added to the IDList.  The
+         rule of thumb is following (in order to get everything right):
+         If the client is directly connected local client then the 
+         `connection' argument must be set and `router' argument must be 
+         NULL to silc_idlist_add_client function.  If the client is not
+         directly connected client then the `router' argument must
+         bet set and the `connection' argument must be NULL to the
+         silc_idlist_add_client function.
+
+       * The funtion silc_server_packet_send_local_channel actually did
+         not check whether the client was locally connected or not.  It
+         does that now.  Fixed a bug related to LEAVE command.
+
+       * Fixed Remove Channel User payload parsing bug in server's
+         silcd/packet_receive.c.  Fixed a bug related to LEAVE command.
+
+       * The server's silc_server_save_channel_key now checks also the
+         global ID list for the channel as it might not be in the local
+         list.  Fixed a bug related to LEAVE command.
+
+       * Is this the end of the [<unknown>] buglet that has been lurking
+         around for a long time?  A little for loop fix in server's
+         silc_server_command_whois_parse that is used by both IDENTIFY
+         and WHOIS command.  At least, this was a clear bug and a cause
+         of one type of [<unknown>] buglet.
+
+       * WHOIS and IDENTIFY commands call the function
+         silc_server_command_[whois/identify]_check function even if
+         we are not router server.
+
+Tue Feb 13 19:55:59 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added --with-gmp configuration option.  If set the GMP
+         is always compiled in the SILC source tree.  If not set then
+         it is checked whether the system has the GMP3 installed.  If
+         it has then the GMP won't be compiled (the system's headers
+         and library is used), if it doesn't have it then the GMP is
+         compiled in the SILC source tree.
+
+Mon Feb 12 11:20:32 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Changed RSA private exponent generation to what PKCS #1
+         suggests.  We try to find the smallest possible d by doing
+         modinv(e, lcm(phi)) instead of modinv(e, phi).  Note: this is
+         not security fix but optimization.
+
+Sun Feb 11 18:19:51 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added new config entry [Identity] to fork the server and run
+         it as specific user and group.  A patch from Bostik.
+
+       * Imported Dotconf configuration library into lib/dotconf.
+         This will be used to create the SILC configuration files later.
+         It will appear in the distsribution after this commit.
+
+Sat Feb 10 21:13:45 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * A big code auditing weekend happening.  Auditing code for 
+         obvious mistakes, bugs and errors.  Also, removing any code
+         that is obsolete.
+
+         Removed files for being obsolete:
+
+         o lib/silcutil/silcbuffer.c (the buffer interface is entirely in
+         inline in the file lib/silcutil/silcbuffer.h)
+
+         o lib/silcutil/silcbufutil.c (the header has inline versions)
+
+         Changed code to fix possible error conditions:
+
+         o The buffer formatting routines now check that the destination
+         buffer really has enough space to add the data.  This applies for
+         both buffer formatting and unformatting 
+         (lib/silcutil/silcbuffmt.[ch]).  Also, the entire buffer
+         unformatting was changed to accomodate following rules: 
+         XXX_*STRING_ALLOC will allocate space for the data into the pointer
+         sent to the function while XXX_*STRING will not allocate or copy 
+         the data into the buffer.  Instead it sets the pointer from the
+         buffer into the pointer sent as argument (XXX_*STRING used to
+         require that the pointer must be allocated already).  This change
+         makes this whole thing a bit more consistent and more optimized
+         (note that the data returned in the unformatting with XXX_*STRING
+         must not be freed now).  The routines return now -1 on error.
+
+         o Tried to find all code that use buffer_format and buffer_unformat
+         and added return value checking to prevent formatting and
+         especially unformatting errors and possible subsequent fatal
+         errors.
+
+         o Changed ske->x and ske->KEY to mallocated pointers in
+         lib/silcske/silcske.h.  Fixed possible data and memory leak.
+
+         o Added return value checking to all *_parse* functions.  Fixed
+         many memory leaks as well.
+
+         o Added length argument to silc_id_str2id in lib/silccore/id.[ch]
+         so that buffer overflows would not happen.  All code now also
+         checks the return value as it can fail.
+
+Mon Feb  5 20:08:30 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added reconnection support to server if the normal server looses
+         its connection to the router (for example if router is rebooted).
+         The server performs normal reconnection strategy implemented
+         to the server.  Affected file silcd/server.c.
+
+Sun Feb  4 13:18:32 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added new packet type SILC_PACKET_SET_MODE that is used to
+         distribute the information about changed modes (for clients,
+         channels and clients channel modes) to all routers in the
+         network.  Updated the protocol specification accordingly.
+
+         Added functions into silcd/packet_send.c and 
+         silcd/packet_receive.c: silc_server_send_set_mode, 
+         silc_server_set_mode.
+
+         Added new files silcmode.[ch] into lib/silccore that implements
+         the encoding and decoding of Set Mode Payload.  Added new type
+         SilcSetModePayload.  Moved the definitions of different modes
+         from lib/silccore/silcchannel.h into lib/silccore/silcmode.h.
+
+Sat Feb  3 15:44:54 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Oops, a little mistake in server's connection authentication 
+         protocol.  The protocol is not ended with FAILURE but with
+         SUCCESS if the authentication is Ok. :)  Affected file is
+         silcd/protocol.c.
+
+       * Implemented NICK_CHANGE notify handling in server in the file
+         silcd/packet_receive.c  The NICK_CHANGE notify is distributed to
+         the local clients on the channel.  After the changing nickname
+         in router environment snhould work and the [<unknown>] nickname
+         should appear no more.
+         The silc_server_replace_id function that receives the Replace ID
+         payload now sends the NICK_CHANGE notify type also in the file
+         silcd/packet_receive.c
+
+       * Changed WHOIS and IDENTIFY command to support the maximum amount
+         of arguments defined in protocol specs (3328 arguments).  This 
+         fixed a bug that caused problems when there were more than three
+         users on a channel.
+
+Fri Feb  2 11:42:56 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added extra parameter, command identifier, to the
+         silc_client_send_command so that explicit command identifier
+         can be defined.
+
+         Changed that ID list routines uses specific command identifier
+         when sending WHOIS/IDENTIFY requests to the server so that they
+         can be identified when the reply comes back.
+
+         Affected files lib/silcclient/command.[ch],
+         lib/silcclient/client.c and lib/silcclient/idlist.[ch].
+
+       * Added `sender' argument to silc_server_packet_send_to_channel
+         to indicaet the sender who originally sent the packet to us
+         that we are now re-sending.  Ignored if NULL.  Affected file
+         silcd/packet_send.[ch].
+
+       * Added some server statistics support in silcd/server_internal.h
+         SilcServerStatistics structure and around the server code.  Also
+         send some nice statistics information when client is connecting
+         to the client.
+
+Thu Feb  1 23:31:21 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Fixed channel ID decoding in server's JOIN command reply in
+         silcd/command_reply.c
+
+       * Fixed braodcasting of replace ID payload to not to send it if
+         we are standalone server in silcd/packet_receive.c.
+
+       * Fixed all channel message sending routines to not to send
+         packets to clients that has router set, since they are routed
+         separately in the same function earlier.  Affects file
+         silcd/packet_send.c and all channel packet sending functions.
+
+        * In USERS reply, res_argv[i] are not allocated, the table
+          is allocated.  Thus changed that free the table, not its
+          internals.
+
+       * In server's whois_check and identify_check if the client is
+         locally connected do not send any WHOIS commands - they are not
+         needed.
+
+Thu Feb  1 21:32:27 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Fixed some minor bugs in client when sending WHOIS command.  The
+         arguments was in wrong order.
+
+       * Removed statis function add_to_channel from server in 
+         silcd/command.c that was previously used with the joining but
+         is obsolete now.
+
+       * Tested USERS command in router environment successfully with two
+         routers, two servers and two clients.
+
+Thu Feb  1 00:54:26 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Reorganized the USERS command and command reply in client library
+         in lib/silcclient/command.c and lib/silcclient/command_reply.c.
+         When the command is given by user we register a pending command
+         callback that will reprocess the command after the reply has been
+         received from the server.  When reprocessing the packet we then
+         display the information.  Thus, the USERS information is displayed
+         now in the command callback instead of in the command reply
+         callback.  The processing of the command is same as previously
+         when server has sent the command reply in the JOINing process.
+
+       * Added to USERS command in silcd/command_reply.c to join the client,
+         we didn't use to know about, to the channel after we've created
+         a client entry for it.  Also, for clienet we did know already still
+         check whether it is on the channel or not and add it if not.
+
+       * Removed silc_server_command_join_notify as the function and its
+         use was obsolete.
+
+Tue Jan 30 22:39:15 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Changed the client's pending command handling to the same as the
+         server's pending command handling.  It is also now possible to
+         execute command reply functions from other command reply
+         function as the function callbacks for commands and command
+         replies are one and same.  The pending commands are not static
+         list anymore, it is mallocated SilcDList in lib/silcclient/client.h
+         in client connection context.  Thus, pending commands are server
+         connection specific as it is convenient.
+
+         Changed the function silc_client_command_pending and
+         silc_client_command_pending_del and added new function
+         silc_client_command_pending_check.  Removed the 
+         SILC_CLIENT_CMD_REPLY_EXEC, and SILC_CLIENT_PENDING_COMMAND_CHECK
+         macros.
+
+       * Added cmd_ident, current command identifier, to the client
+         connection context in lib/silcclient/client.h to keep track on
+         command identifiers used in command sending.  Client's command reply
+         function handling now supports the mandatory command identifiers.
+
+       * Added SILC_CLIENT_COMMAND_EXEC_PENDING macros to all command reply
+         funtions in client to fully support pending command callbacks.
+
+       * NOTE: the name_list in USERS (old NAMES) command is NOT sent anymore
+         as one of the arguments to the application in the command reply
+         client operation.
+
+       * NOTE: The FORWARDED flag is depracated.  It used to be depracated
+         before first releasing SILC but came back.  Now it is removed again
+         and should come back nomore.  The FORWARDED flag was used only
+         by the JOINing procedure by forwarding the command packet to router.
+         Now, the JOINing procedure has been changed to more generic (due
+         to various router environment issues) and FORWARDED is not needed
+         anymore for anything.  The protocol specification is yet to be
+         updated.
+
+         Now, removed silc_server_packet_forward from server and the flag
+         SILC_PACKET_FORWARDED from lib/silccore/silcpacket.h.
+
+Tue Jan 30 00:05:05 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Renamed NAMES command to USERS command.  The NAMES was named that
+         due to historical reasons.  Now it is renamed.  Also, rewrote
+         parts of the USERS command.  The nickname list is not sent anymore
+         by the server.  Only Client ID and mode lists are sent in the USERS
+         command.  Changed this also to the protocol specification.
+
+         The client now resolves the names and stuff after it receives
+         the USERS list from the server when joining to the channel.
+
+       * WHOIS and IDENTIFY commands has been changed to support multiple
+         Client ID's per command.  One can now search for multiple users
+         in the network by sending only one WHOIS or IDENTIFY command.
+         Changed the code and the protocol specifications.
+
+       * Removed silc_server_command_identify_parse and changed that IDENTIFY
+         uses silc_server_command_whois_parse to parse the request. */
+
+       * If normal server, do not parse the WHOIS and IDENTIFY requests
+         before sending it to the router.  Saves some time.
+
+Sun Jan 28 16:19:49 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Fixed JOIN command on client library.  Wrong number of arguments
+         used to crash the client.
+
+       * Added silc_server_channel_has_global function to check whether
+         channel has global users or not.
+
+       * Added silc_server_channel_has_local function to check whether channel
+         has locally connected clients on the channel.
+
+       * The silc_server_remove_from_one_channel now checks whether the
+         channel has global users or not after given client was removed from
+         the channel.  It also checks whether the channel has local clients
+         on the channel anymore.  If it does not have then the channel entry
+         is removed as it is not needed anymore.
+
+       * The silc_server_notify now checks on JOIN notify whether the joining
+         client is one of locally connected or global.  If it is global then
+         the channel has now global users on the channel and that is marked
+         to the channel entry.  Also, it now saves the global client to
+         global list who is joining and JOINs it to the channel.  This is
+         for normal server, that is.
+
+         Changed silc_server_send_notify_on_channel, 
+         silc_server_packet_relay_to_channel and 
+         silc_server_packet_send_to_channel check if we are normal server
+         and client has router set (ie. global client) do not send the
+         message to that client, as it is already routed to our router.
+
+       * Implemented LEAVE notify type handling in silc_server_notify 
+         function.
+
+       * Tested LEAVE command in router environment successfully.  Tested
+         with two routers, two servers and two clients.
+
+       * Updated TODO.
+
+       * idlist_find_xxx_by_id routines now dumps the ID on the debug mode.
+
+       * Implemented SIGNOFF notify type handling in silc_server_notify
+         function.
+
+       * silc_server_remove_id now removes the client entry from all channels
+         it has joined and thusly sends SIGNOFF notify type.
+
+       * Rewrote the NAMES list generation in server by removing two excess
+         loops.  The lists are created now inside one loop.
+
+Sat Jan 27 22:34:56 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * silc_server_remove_channel_user checks now also global list
+         for channel and client.
+
+       * silc_server_new_channel_user checks now both local and global
+         list for channel and client.  Fixed a bug in client id decoding.
+         Used to decode wrong buffer.
+
+       * silc_server_channel_message checks now both local and global
+         list for channel entry.
+
+       * Tested channel joining (hence JOIN) in router environment
+         successfully.  Tested with two routers, two servers and two
+         clients.
+
+       * Tested channel message sending in router environment successfully.
+
+Thu Jan 11 03:22:57 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added silc_server_save_channel_key into server.[ch] to save the
+         received channel key in Channel Key payload processing. It is
+         also used in JOIN command reply handling.
+
+         Equivalent function silc_client_save_channel_key added into
+         client.[ch] into client library.
+
+       * Changed JOIN command reply to send information whether the channel
+         was created or not (is existing already) and the channel key 
+         payload.  Changed protocol specs accordingly.
+
+       * Fixed bugs in WHOIS and IDENTIFY command reply sending when
+         the request was sent by ID and not by nickname.  Crashed on
+         NULL dereference.
+
+Sat Dec 23 21:55:07 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Fixed a bug in Client library.  IDENTIFY and WHOIS reply functions
+         now correctly save the received data.
+
+       * silc_server_free_sock_user_data now notifies routers in the 
+         network about entities leaving the network.
+
+         At the same time implemented functions silc_server_remove_id
+         and silc_server_send_remove_id to receive and send REMOVE_ID
+         packets.  The packet is used to notify routers in the network
+         about leaving entities.  The ID removed will become invalid in
+         the network.
+
+       * Added function silc_idlist_del_server into server. Removes and
+         free's server entry from ID list.
+
+       * silc_server_private_message function now checks, if we are router,
+         that the destination ID really is valid ID, naturally.
+
+       * In router when NEW_ID packet is received (for new client) the
+         hash of the Client ID is saved in the ID Cache but the
+         client->nickname is set to NULL, instead of putting the hash
+         to it as well.
+
+         IDENTIFY command now also checks that client->nickname must be
+         valid. If it is not if will request the data from the server who
+         owns the client.  Added new function 
+         silc_server_command_identify_check.
+
+       * Added silc_command_set_command into lib/silccore/silcommand.[ch]
+         to set the command to already allocated Command Payload.
+
+       * Tested private message sending in router environment with two
+         routers, two servers and two clients.  Fixed minor bugs and now
+         it works fine.
+
+       * Fixed segfault from client's NAMES command. Used to crash if
+         not on any channel.
+
+       * Forwarded packets must not be routed even if it is not destined
+         to the receiver.  Changed server code comply with this.
+
+Sun Dec 17 14:40:08 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added `require_reverse_mapping' boolean value to ServerParams
+         structure. If TRUE (not default) the server will require that
+         the connecting host has fully qualified domain name.
+
+         If the reverse mapping is not required and hostname could not be
+         found the IP address is used as hostname.
+
+Sat Dec 16 17:39:54 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Implemented version string checking to both client and server.
+         The check is incomplete currently due to the abnormal version 
+         strings used in development version of SILC.
+
+       * Changed all command functions in server to use the new
+         CHECK_ARGS macro.
+
+Fri Dec 15 15:55:12 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Changed char *data to unsigned char *data in ID Cache system to
+         support binary data as ID Cache data. Changed code to support
+         binary data in lib/silccore/idcache.c.
+
+       * Renamed silc_server_packet_relay_command_reply to 
+         silc_server_command_reply as it is normal packet receiving
+         function. Rewrote the function to accept command replys for
+         servers and not only for clients.
+
+       * Mark remote router always as registered server if we are connecting
+         to it.  Otherwise, commands sent by the router to us are ignored.
+
+       * All ID List find routines now returns the ID Cache Entry pointer
+         as well if requested.
+
+       * WHOIS command works now in router environment, tested with two
+         routers, two servers and two clients.
+
+       * Cleaned up and rewrote IDENTIFY command. IDENTIFY should work now
+         in router environment (as it is almost equivalent to WHOIS) but
+         hasn't been tested thoroughly.  Added new functions:
+
+         silc_server_command_identify_parse
+         silc_server_command_identify_send_reply
+         silc_server_command_identify_from_client
+         silc_server_command_identify_from_server
+
+       * Disabled route cache adding because adding two different ID's with
+         same IP replaces the old cache entry thus giving wrong route.
+         The entry->router->connection is always the fastest route anyway
+         so route cache may not be needed.  Of course, new routes maybe
+         established after receiving the ID when the entry->router->connection
+         might not be anymore the most optimal.
+
+Thu Dec 14 15:55:35 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Add route cache for received ID for fast routing.
+
+       * Added silc_server_packet_route to route received packet on router
+         that is not destined to us.
+
+       * Renamed silc_server_get_route to silc_server_route_get.
+
+       * Added id_string and id_string_len fields into SilcServer to
+         include encoded ServerID for fast comparing without excess
+         encoding of the ID's.
+
+       * Cleaned up WHOIS command on server side. Added following static
+         functions:
+
+         silc_server_command_whois_parse
+         silc_server_command_whois_check
+         silc_server_command_whois_send_reply
+         silc_server_command_whois_from_client
+         silc_server_command_whois_from_server
+
+       * Added macro SILC_SERVER_COMMAND_CHECK_ARGC to check mandatory
+         arguments in command replies. All command functions should be
+         updated to use this macro.
+
+Sun Dec 10 23:52:00 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Minor typo fixes on command reply handling on server.
+
+Tue Nov 28 11:05:39 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added silc_server_command_add_to_channel internal routine to add
+         the client to the channel after router has created the channel and
+         sent command reply to the server.
+
+       * Added generic silc_server_send_command to send any command from
+         server.
+
+       * Use static buffer with ID rendering instead of duplicating data.
+
+Mon Nov 27 21:39:40 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Fixed a channel user mode bug when joining to a channel server gave
+         everybody channel founder rights, oops.
+
+       * We mark ourselves as the router of the incoming server connection
+         if we are router ourselves.  This way we can check in some packet
+         sending functions whether it is locally connected server.  For
+         incoming router connections we put NULL.
+
+       * For router sending packets locally means now always sending the
+         packet cell wide; to local clients and local servers.  For normal
+         server sending packet locally means sending it to only local
+         clients.
+
+       * Fixed the JOIN command to really work in router environment.  If the
+         channel is created it is always created by the router.  Router is
+         also responsible of making the initial joining to the channel,
+         sending JOIN notify to the sending server and distributing 
+         NEW_CHANNEL and NEW_CHANNEL_USER packets.  Hence, if the channel
+         does not exist server doesn't do anything else but forward the
+         command to the router which performs everything.
+
+       * Added silc_server_send_channel_key function to send the Channel Key
+         payload.
+
+       * Added silc_server_create_channel_key to create new channel key.  The
+         channel key is now re-generated everytime someone joins or leaves
+         a channel, as protocol dictates.  Note: channel->key_len is the
+         key length in bits.
+
+Wed Nov 22 22:14:19 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Splitted server.[ch] finally.  Created now packet_send.[ch] and
+         packet_receive.[ch] to separate packet sending and receiving
+         routines.  The server.[ch] now includes everything else including
+         actual packet processing (writing and reading data) and other
+         server issues.
+
+         Renamed silc_server_private_message_send_internal to
+         silc_server_send_private_message.  The routine is still though
+         used only to relay private messages as server does not send
+         private messages itself.
+
+         Renamed silc_server_new_channel to silc_server_create_new_channel
+         and added new function sicl_server_new_channel that handles the
+         incoming New Channel packet.  Added also new sending function
+         silc_server_send_new_channel to send New Channel Payload.
+
+       * Added new function silc_server_notify to process incoming notify
+         packet to the server/router. Server may then relay the notify
+         to clients if needed.
+
+       * Added new function silc_server_new_channel_user to process incoming
+         New Channel User packet.  Router will redistribute the packet and
+         send JOIN notify to its local clients and locally connected servers
+         if needed.  Normal server will send JOIN notify to its local client
+         on same channel when received this packet.  Added also corresponding
+         sending function silc_server_send_new_channel_user to sent the
+         payload.
+
+       * Added boolean route argument to send_notif_to_channel and
+         packet_send_to_channel functions to attempt to route the packet
+         if it is TRUE and send only locally if it is FALSE.
+
+Tue Nov 21 19:49:31 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * silc_server_replace_id now broadcasts the received replace ID
+         packet if it is not broadcast packet already. The router must
+         broadcast to inform other routers about changed ID.
+
+       * Added backpointer to server's router into SilcServer context in
+         silcd/server_internal.h.
+
+       * Fixed silc_server_packet_broadcast to send correct broadcast
+         packets.
+
+       * The channel key is now distributed to the local client as soon
+         as it is received from the router (in router environment) so that
+         no other packet may be sent for the channel until client has 
+         received the key.
+
+       * silc_server_remove_channel_user now broadcasts the received
+         Remove Channel User packet if it is not broadcast packet already.
+         The router must broadcast to inform other routers about removed
+         channel user.
+
+       * Added users field into SilcPacketContext that is a reference count
+         of the context.  One can increase the reference count by calling
+         silc_packet_context_dup which is now changed to just increase the
+         reference count instead of duplicating the data.  The reference
+         count is decresed by calling silc_packet_context_free that will
+         free the data after the reference count hits zero.
+
+         For now on the packet context and everything allocated into it
+         (including the raw packet from network) must be freed by calling
+         the new silc_packet_context_free function.  Added also new function
+         silc_packet_context_alloc that must be used now to allocate the
+         context.  This also means that if a routine is asynchronous from
+         silc_[client/server]_packet_parse_type the packet context must
+         be duplicated by calling silc_packet_context_dup.  Otherwise it
+         gets free'd after silc_[client/server]_packet_parse_type returns.
+         Also, one must remember that if packet is duplicated then its 
+         reference count must be decresed by calling the free function as
+         many times as it was duplicated.
+
+       * Changed SilcBuffer field from protocol contexts to SilcPacketContext
+         from both client and server.
+
+Mon Nov 20 23:47:03 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Made joining to a channel working in router environment.
+
+       * Cleaned up JOIN command on server side and create function
+         silc_server_command_join_channel internal routine to make the
+         joining happen.
+
+Thu Nov  9 21:12:39 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Changed silc_command_pending list to SilcDList.  Also, added
+         `ident' field to SilcServerCommandPending structure to identify
+         the reply and to call correct callback.
+
+         Added silc_server_command_pending_check function to replace the
+         corresnponding macro.  The silc_command_pending list is not
+         extern anymore.
+
+       * Added silc_command_set_ident into lib/silccore/silccommand.[ch]
+         to set identifier to previously allocated Command Payload.  It
+         is used to set identifier for command when resending Command
+         Payload.
+
+       * Added silc_command_payload_encode_payload to encode Command
+         Payload buffer from SilcCommandPayload structure.
+
+       * Added silc_argument_payload_encode_payload to encode Argument
+         payload buffer from SilcArgumentPayload structure.
+
+Wed Nov  8 21:03:28 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Changed WHOIS command to support router connection on server side.
+         The whois request is always sent to router unless the server is
+         standalone server.  After server has received the reply from the
+         router will it send the reply to the client.
+
+       * Added silc_server_packet_broadcast into silcd/server.[ch] to
+         broadcast received broadcast packet.  The function is used only
+         by router.  The broadcast packet is always sent to the router's
+         primary route.
+
+       * Added silc_id_render function in lib/silcutil/silcutil.[ch] to
+         render given ID to printable string, for log files for example.
+
+Tue Nov  7 22:14:19 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Made basic router to router connections working.  At least they
+         can now connect to each other but nothing really works the way
+         they are supposed - yet.
+
+       * Added new initiator token to RouterConnection configuration
+         file in silcd/serverconfig.[ch].  It is used to tell whether we
+         are the initiator to the remote router or whether we'll expect
+         the other end to connect.
+
+       * Moved registering of listener task to silc_server_init, hence
+         the server starts listenning as soon as it is run, even if it
+         does not have connections to other routers.  Let's see how well
+         this will work.
+
+       * Changed default connection retry timeouts for more suitable in
+         silcd/server.h.
+
+       * Removed cipher and such arguments from silc_idlist_add_client
+         and silc_idlist_add_server prototypes from silcd/idlist.[ch].
+         Added new function silc_idlist_add_data to add the keys and stuff
+         to any ID entry.
+
+       * Added SilcIDListData structure and added it to SilcClientEntry
+         and SilcServerEntry as their first field in the structure.  This
+         way we can explicitly cast the ID entries to the SilcIDListData
+         structure and get common data for the entries.  In past, we had
+         to first check what type of connection it is and then cast it to
+         correct ID entry type.  Now, we can directly cast the opaque
+         pointer to the SilcIDListData (no matter what ID entry it actually
+         is) and get the data needed.
+
+Mon Nov  6 21:56:12 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Wow, found a bug in scheduler.  The scheduler uninitialized itself
+         in some circumstances even if threre were timeout tasks, though not
+         IO tasks, but tasks anyway.  Now fixed.
+
+       * Defined SilcServerConnection structure to hold connection specific
+         stuff about directly connected servers and routers.  The definition
+         is currently in silcd/server_internal.h.  I thought about having
+         a bit more important role fro this struct but for now it is used
+         only when connecting to other server (or router actually).
+
+       * Added connecting retry support in server when connecting to
+         router(s).  The retry feature implement exponential backoff
+         algorithm.  Also, added SilcServerParams structure to hold default
+         parameters for server.  For now, it include these retry settings
+         and are hard coded.  After server is moded to be as Silc Server
+         Library this structure will be more important.
+
+Sun Nov  5 22:28:44 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Changed client librarys channel->clients table to SilcList and
+         changed code accordingly.
+
+Thu Nov  2 16:28:01 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Changed client's channel table to SilcList and changed code 
+         accordingly.  Also changed SilcChannelClientEntry to include back-
+         pointer to the channel so that client entry can use that structure
+         as list as well and we have fast cross-reference to the channel.
+         This change dramatically decreased the complexity of channel
+         handling with client entry and vice versa (removed one extra
+         loop when searching for channel entry from many functions).
+
+       * Changed server->sim from table to SilcDList and changed code
+         accordingly.
+
+       * NAMES command can now be used from user interface.  It will show
+         the user list on the channel, neatly.
+
+       * Added realname pointer to SilcClientEntry in lib/silcclient/idlist.h.
+         Code now saves realname of the user if it becomes available.
+
+       * Renamed configure.in to configure.in.pre and made ./prepare
+         script to automatically add correct version string to
+         configure.in which it creates from configure.in.pre.
+
+Wed Nov  1 17:21:26 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * NAMES command reply now shows users mode with the nickname when
+         joining to channel.
+
+       * Moved silc_client_ch[u]mode[_char] functions from 
+         silc/clientutil.[ch] to lib/silcclient/client.[ch].  Though, that
+         place sucks, they are utility functions and should be in some
+         other file.
+
+       * Fixed some unsigned int's to unsigned short's.  Patch by cras.
+
+       * Fixed contrib/getopt*.[ch] to not require config.h.  Patch by
+         cras.
+
+Tue Oct 31 20:10:37 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Updated README.
+
+       * Added TRQ (efficient deque and list library) into lib/trq.  This is
+         a very good list library that is currently used in the SILC.  Defined
+         SilcList API over the library because I didn't like the API very
+         much.  See lib/trq/silclist.h for the API and examples of how to
+         use the API.  Fixed various places in the code to use the new
+         SilcList API. The SilcList is meant for lists that has a structure
+         already defined as a list.  It is not suitable to add just some
+         context to the list (in TRQ, the context is the list actually).
+
+         So, I defined SilcDList that can be used for the purpose where 
+         predefined list structure does not exit.  This can be used as
+         such list.  Now some context just can be added to the SilcDList.
+         Currently this list is not used in the SILC just yet, though there
+         are a lot places where this can replace dynamically allocated
+         tables and I will fix these places, later, to use SilcDList.
+         See lib/trq/silcdlist.h for SilcDList (they are all inline functions,
+         and use TRQ internally).
+
+         Also fixed some annoying warning messages that the original TRQ
+         code generated.  Also minor changes to TRQ's Makefile.in.
+
+       * Added support for querying by Client ID to both WHOIS and 
+         IDENTIFY commands into server, as required by the protocol.
+
+       * Removed method function pointers from SilcBuffer structure. They
+         weren't used to anything and just increased the context size for
+         no good reason.  This change also made silc_buffer_alloc and
+         silc_buffer_free functions inline functions.
+
+       * Disabled command flooding detection support until it's fixed so 
+         that it accepts commands in but does not execute them more than once
+         in two seconds.
+
+       * Added silc_net_localhost(), to return local hostname, into
+         lib/silcutil/silcnet.[ch].  Also added client->hostname pointer
+         that must be initialized before calling silc_client_init.
+
+       * Added new function: silc_server_send_notify_on_channels to send
+         notify messages to all channels client has joined.  It is assured
+         that the message is sent only once per client.
+
+       * Moved silc_log_format (from lib/silcutil/silclog.[ch] into
+         lib/silcutil/silcutil.[ch] as silc_format function.  The new 
+         function is generic and is used by server as well, not only by
+         the logging routines.
+
+       * Added new SKE status type: SILC_SKE_STATUS_BAD_VERSION to indicate
+         the provided version string was not acceptable.  Added new function:
+         silc_ske_check_version into lib/silcske/silcske.h.  The function
+         must be implemented by the application (client or server) and it
+         does not reside in the SKE library.  The function checks the version
+         string remote end sent.
+
+       * Added back pointers (to opaque context and to SilcSocketConnection) 
+         into SilcPacketContext structure into lib/silccore/silcpacket.h.
+
+       * Added silc_packet_context_dup into lib/silccore/silcpacket.[ch] to
+         duplicate packet context structure.
+
+       * Changed `notify' client operation to send same arguments as client
+         receives from server except for ID's.  ID's are mapped to correct
+         ID entry and that is returned.  Also, if channel entry is not sent
+         by server but the notify is for channel the channel entry is sent
+         to application (otherwise application doesn't know that it is for
+         channel (library gets it from packet's Destination ID)).
+
+       * Added silc_client_remove_from_channels into client library to 
+         remove a client from all channels it has joined to.  Used when 
+         received SIGNOFF notify from server.  Added also new function
+         silc_client_replace_from_channels to replace old ID entry with
+         new ID entry on all channels.  Used when received NICK_CHANGE
+         notify from server.
+
+       * Fixed ID Cache list handling in silc_idlist_get_client in 
+         lib/silcclient/idlist.c.  Also, added silc_idlist_get_client_by_id
+         to get (or query) client by ID.
+
+       * Updated TODO list.
+
+       * Added connection authentication status message defined by the
+         protocol: SILC_CONN_AUTH_OK and SILC_CONN_AUTH_FAILED and added the
+         support for these into the code in client and server side.
+
+       * Added generic function silc_client_send_command to send any command
+         with variable argument list.  Application should use this function
+         to send commands if the command functions provided by the library
+         does not suite for the application's user interface needs.
+
+       * Added new `failure' client operation.  Application is notified about
+         received failure packet if client is executing a protocol.  In this
+         case the protocol's execution has failed.
+
+       * Added SKE's end notify to send the SKE_SUCCESS notify message that
+         is required by the protocol.
+
+       * Added SILC_PROTOCOL_STATE_FAILURE to indicate received failure
+         packet from remote.  SILC_PROTOCOL_STATE_ERROR indicates local
+         error at our end.
+
+       * Added status flag to SilcSKE object to indicate realtime status
+         of the SKE protocol.
+
+       * Application receives now exactly same command reply arguments as
+         the library receives from server.  However, if ID is received the
+         corresponding ID entry is returned to the application (eg. Client
+         ID is mapped to correct SilcClientEntry entry and that is returned).
+         Changed command_reply client operation due to this change.
+
+       * Changed all ID's in commands and in command replys as ID Payloads.
+         Change affected both client and server side codes.
+
+         All ID's sent in SILC network (with execption of ID's in SILC
+         Packet header) are sent in ID Payload to support variable length
+         ID's.
+
+       * Server now notifies nick changes and notifies all clients on
+         the channels about the new nickname (about the new Client ID,
+         actually).
+
+       * Implemented CMODE command to change channel modes. Supports all
+         channel modes defined by the protocol specs except ban and invite
+         lists. (Also, private channel key mode is supported but support for
+         setting private channel key in client is missing, thus, this mode
+         has no effect on client side (except that server requires that the
+         client uses private channel key and normal channel traffic does not
+         work anymore)).
+
+         Also, invite mode works per se, but INVITE command does not work
+         yet correctly, so you can set channel as invite only channel but
+         inviting clients to the channel does not work (it is yet to be
+         thought what's the best way to do it).
+
+       * Added new command SILC_COMMAND_CUMODE to change user mode on the
+         channel.  Defined user modes: CHANNEL_FOUNDER and CHANNEL_OPERATOR.
+         Implemented CUMODE command to change user's mode on the channel.
+         Supports all modes defined by the protocol specs.
+
+       * Added NAMES command reply to return users modes on the channel.
+
+       * Removed unnecessary and slow ciphers from lib/silccrypt.
+
+       * Set SO_KEEPALIVE option to connection sockets by default.
+
+       * Added new command reply status: SILC_STATUS_USER_NOT_ON_CHANNEL.
+
+       * Added notify types: MOTD, CMODE_CHANGE and CUMODE_CHANGE.  Also,
+         redefined the Notify Payload into protocol specs.
+
+       * Added silc_id_payload_parse_id to get ID directly from raw
+         ID payload data.
+
+Mon Oct  9 20:57:02 EEST 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Changed SILC_COMMAND_IDENTIFY in protocol specification to 
+         accept searching by Client ID as well.
+
+       * Added support for LEAVE and SIGNOFF notify types in client library.
+
+       * Added silc_id_payload_parse_data into lib/silccore/silcpayload.[ch]
+         to parse ID Payload from raw data.
+
+Sun Oct  8 19:33:08 EEST 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added flags parameter into silc_ske_assemble_security_properties
+         function in lib/silcske/silcske.[ch].
+
+       * Changed notify client operation to fit better for notify messages
+         sent by server.  The notify payload received from server is now
+         passed to the application (after parsing it to SilcNotifyPayload).
+         It is application's responsibility to retrieve the arguments
+         from the payload and show the message the way it wants.  The message
+         sent by server is implementation specific.
+
+       * Changed public keys to comply with the protocol specification.
+         Old public keys are not supported anymore and are not compatible.
+
+       * Removed nickname from Channel Payload as the latest draft removed
+         it.  The client must resolve the nickname from the NAMES command
+         reply received when it joined the channel.
+
+         Also, changed all channel_xxxx_payload to channel_payload_xxxx.
+
+Sat Oct  7 21:55:01 EEST 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Fixed some errors in protocol specification drafts.
+
+       * Created lib/silccore/silcnotify.c to implement Notify Payload
+         encoding and decoding, lib/silccore/silcpayload.[ch] to implement
+         generic payloads described by protocol specifications.  The file
+         includes implementations for ID Payload and Argument Payload.
+
+       * Changed Command Payload implementation to use the new Argument
+         Payload.  Changed command_xxxx_payload to command_payload_xxxx
+         to comply with SILC coding conventions.
+
+       * Added suppport for Argument Payload handling in Notify Payload
+         implementation as protocol requires it.  Added the new support
+         into server and client lib as well.
+
+Thu Oct  5 21:16:28 EEST 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
 
        * Added support for multiple nicknames on same channel.  [n] is
          added locally to the nickname if there are more than one same
@@ -15,7 +1713,7 @@ Fri Oct  5 21:16:28 EEST 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
 
        * Changed version strings to comply ISO 8601.
 
-Thu Oct  4 23:29:06 EEST 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+Wed Oct  4 23:29:06 EEST 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
 
        * Fixed protocol error handling in client library.  It should now
          cope even if the SKE fails for some reason.