Merged silc_1_0_branch to trunk.
[silc.git] / TODO-1.0
index 73e5a27bc4c2bbffb83c63e54fe1872255e611ff..46a8ab470be67d4a975d17cf2bc2d7d323e8115c 100644 (file)
--- a/TODO-1.0
+++ b/TODO-1.0
@@ -1,30 +1,12 @@
-TODO After 1.0
-==============
+TODO for 1.1 And Beyond
+=======================
 
 
-A rough list of stuff that is going to be done to SILC after 1.0 or at
-least could be done.
+lib/silccrypt
+=============
 
  o Implement the defined SilcDH API.  The definition is in
    lib/silccrypt/silcdh.h.
 
 
  o Implement the defined SilcDH API.  The definition is in
    lib/silccrypt/silcdh.h.
 
- o X.509 certificate support.  SILC protocol supports certificates and
-   it would be great to have support for them.  This is a big task as
-   support has to be made for ASN.1 as well.  I've looked into OpenSSL 
-   package as it has X.509 certificate support (and ASN.1 as well).  
-   The code does not look very good to my eye but it has some potentials.
-   This should be looked at more closely.
-
-   Naturally own SILC Certificate API has to be defined regardles what
-   the actual X.509 library is (OpenSSL X.509 or something else).  Other
-   choice is to write own X.509 library but I'm not going to do it - 
-   I can help to migrate the OpenSSL X.509 into SILC and I can help if 
-   someone would like to write the X.509 library - but I'm not going 
-   to start writing one myself.  Anyhow, the OpenSSL X.509 lib should
-   be checked.
-
-   Other package that should be checked is the NSS's X509 library,
-   which I like more over OpenSSL package.
-
  o SSH2 public keys support, allowing the use of SSH2 public keys in
    SILC.
 
  o SSH2 public keys support, allowing the use of SSH2 public keys in
    SILC.
 
@@ -39,145 +21,321 @@ least could be done.
    and certificates as well.  Add fe. silcpk.h into silccore.  It should
    also include the Public Key Payload encoding and decoding routines.
 
    and certificates as well.  Add fe. silcpk.h into silccore.  It should
    also include the Public Key Payload encoding and decoding routines.
 
+ o Add DSS support.
+
+ o Cipher optimizations (asm, that this) at least for i386 would be nice.
+
+ o ECDSA and ECDH.
+
+
+lib/silccore/silcpacket.[ch]   ****PARTLY DONE****
+============================
+
+ o SilcPacketEngine.
+
+ o New SILC Packet API.
+
+
+lib/silccore/silcid.[ch]
+========================
+
+  o Add silc_id_str2id to accept the destination buffer as argument
+    and thus not require any memory allocation.  Same will happen
+    with silc_id_payload_* functions.
+
+  o silc_id_str2id, silc_id2str to non-allocating routines.
+
+
+lib/silcutil
+============
+
  o Compression routines are missing.  The protocol supports packet
    compression thus it must be implemented.  SILC Zip API must be
    defined.
 
  o Compression routines are missing.  The protocol supports packet
    compression thus it must be implemented.  SILC Zip API must be
    defined.
 
- o Optimizations in Libraries
-
-       o There is currently three (3) allocations per packet in the
-         silc_packet_receive_process, which is used to process and
-         dispatch all packets in the packet queue to the parser callback
-         function.  First allocation is for parse_ctx, second for the
-         SilcPacketContext, and third for packet->buffer where the actual
-         data is saved.
-
-         The parse_ctx allocation can be removed by adding it as a
-         structure to the SilcPacketContext.  When the SilcPacketContext
-         is allocated there is space for the parse context already.
-
-         The silc_packet_context_alloc could have a free list of
-         packet contexts.  If free packet context is found from the list
-         it is returned instead of allocating a new one.  The library
-         could at first allocate them and save them to the free list
-         until enough contexts for smooth processing exists in the list.
-         This would remove a big allocation since the structure is
-         quite big, and even bigger if it would include the parse_ctx.
-
-         The packet->buffer can be optimized too if the SilcBuffer
-         interface would support free lists as well.  Maybe such could
-         be done in the same way as for SilcPacketContext.  The
-         silc_buffer_alloc would check free list before actually 
-         allocating new memory.  Since the packets in the SILC protocol
-         usually are about the same size (due to padding) it would be
-         easy to find suitable size buffer from the free list very
-         quickly.
-
-         These naturally cause the overal memory consumption to grow
-         but would take away many allocations that can be done several
-         times in a second (see also ~/silcpacket).
-
-       o Move the actual file descriptor task callback (the callback that
-         handles the incoming data, outgoing data etc, that is implemnted
-         in server and client separately (silc_server_packet_process and
-         silc_client_packet_proces)) to the low level socket connection
-         handling routines, and create an interface where the application
-         can register a callbacks for incoming data, outoing data and EOF
-         receiving, which the library will call when necessary.  This way 
-         we can move the data handling in one place.
-
-       o Add silc_id_str2id to accept the destination buffer as argument
-         and thus not require any memory allocation.  Same will happen
-         with silc_id_payload_* functions.
-
-       o Remove the `truelen' field from SilcBuffer as it is entirely
-         redundant since we can get the true length of the buffer by
-         doing buffer->end - buffer->header.  Add SILC_BUFFER_TRUELEN
-         macro instead.  Consider also removing `len' field too since
-         it effectively is buffer->tail - buffer->data, and adding
-         SILC_BUFFER_LEN macro can do the same.  These would save
-         totally 8 bytes of memory per buffer.
-
- o Optimizations in Server
-
-       o Remove the big switch statement from the function 
-         silc_server_packet_parse_type and replace it with predefined
-         table of function pointers where each of the slot in table
-         represents the packet type value.
-
-         Same could be done with notify packets which has big switch 
-         statement too.  Same kind of table of notify callbacks could be
-         done as well.
-
-       o The parser callback in the server will add a timeout task for
-         all packets.  It will require registering and allocating a
-         new task to the SilcSchedule.  Maybe, at least, for server
-         and router packets the parser would be called immediately
-         instead of adding it to the scheduler with 0 timeout.  It
-         should be analyzed too how slow the task registering process
-         actually is, and find out ways to optimize it.
-
-       o The SERVER_SIGNOFF notify handing is not optimal, because it'll
-         cause sending of multiple SIGNOFF notify's instead of the one
-         SERVER_SIGNOFF notify that the server received.  This should be
-         optimized so that the only SERVER_SIGNOFF is sent and not
-         SIGNOFF of notify at all (using SIGNOFF takes the idea about
-         SERVER_SIGNOFF away entirely).
-
-        o Another SERVER_SIGNOFF opt/bugfix:  Currently the signoff is
-          sent to a client if it is on same channel as the client that
-          signoffed.  However, the entire SERVER_SIGNOFF list is sent to
-          the client, ie. it may receive clients that was not on the 
-          same channel.  This is actually against the specs.  It must be
-          done per channel.  It shouldn't receive the whole list just
-          because one client happened to be on same channel.
-
-       o See also ~/silcserver
+ o Add builtin SOCKS and HTTP Proxy support, well the SOCKS at least.
+   SILC currently supports SOCKS4 and SOCKS5 but it needs to be compiled
+   in separately.
+
+ o bool -> SilcBool
+
+ o SilcBit, bit field:
+
+   #define SilcBit(b) unsigned int b : 1
+
+
+lib/silcutil/silcbuffer.h      ****DONE****
+=========================
+
+ o Remove the `truelen' field from SilcBuffer as it is entirely
+   redundant since we can get the true length of the buffer by
+   doing buffer->end - buffer->header.  Add silc_buffer_truelen
+   macro instead.  Consider also removing `len' field too since
+   it effectively is buffer->tail - buffer->data, and adding
+   silc_buffer_len macro can do the same.  These would save
+   totally 8 bytes of memory per buffer.
+
+
+lib/silcutil/silcbuffmt.[ch]   ****PARTY DONE****
+============================
+
+ o SILC_STR_APPEND, _APPEND_TAIL.
+
+ o SILC_STR_OFFSET
+
+
+lib/silcutil/silcstack.[ch]    ****DONE****
+===========================
+
+ o Data stack implementation
+
+
+lib/silcutil/silcstream.[ch]   ****DONE****
+============================
+
+ o Add abstract SilcStream.
+
+
+lib/silcutil/silcsocketstream.[ch]     ****PARTY DONE****
+==================================
+
+ o Add SilcSocketStream.
+
+
+lib/silcutil/epoc/*
+===================
+
+  o lib/silcutil/epoc routines missing or not completed.
+
+  o The PKCS#1 also calls global RNG (even though it is not used
+    currently in SILC, the interface allows its use).
+
+  o Something needs to be thought to the logging globals as well,
+    like silc_debug etc.  They won't work on EPOC.  Perhaps logging
+    and debugging is to be disabled on EPOC.
+
+
+lib/silcutil/silcschedule*.[ch]
+===============================
+
+ o Scheduler can be optimized for FD tasks by changing the fd_queue
+   to SilcHashTable instead of using linked list.  We need to do
+   one-to-one mapping of FD to task and hash table is more efficient
+   for this usage.
+
+   Also redefine the silc_select to perhaps return a separate
+   structure of the events that actually occurred, instead of
+   returning the events in the fd_list which is then traversed
+   in the generic code to find the changed events.  This can be
+   made faster by having own struct which includes only the
+   changed events, thus the tarversing is faster since the whole
+   fd_list is not traversed anymore (it is still traversed in the
+   silc_select but at least it removes one extra tarversing later
+   for the same list).
+
+   Other task queues should be changed to use SilcList.
+
+ o Add SILC scheduler's internal routines into a table of implementation
+   function pointers, that the generic code then takes as extern from
+   implementation.  These are the silc_schedule_internal_* routines.
+
+ o Change SILC_TASK_CALLBACK to non-static, and remove the macro
+   SILC_TASK_CALLBACK_GLOBAL.
+
+
+lib/silcutil/silcasync.[ch]    ****DONE****
+===========================
 
  o Add SilcAsyncOperation to utility library.  Any function that takes
 
  o Add SilcAsyncOperation to utility library.  Any function that takes
-   callback as an argument must/should return SilcAsyncOperation (see 
-   ~/silcasync).
+   callback as an argument must/should return SilcAsyncOperation.
 
 
- o Rewrite SilcProtocol to be SilcFSM (see ~/silcfsm).
 
 
- o Do some scheduler optimizations and interface changes (see 
-   ~/silcschedule).
+lib/silcutil/silctime.[ch]     ****DONE****
+===========================
 
 
- o Change the lib/silccore/silcpacket.[ch] interfaces (see ~/silcpacket).
+ o SilcTime.
 
 
- o Add abstract SilcStream and SilcSocketStream (see ~/silcstream).
+ o system time, universal, generalized.
 
 
- o Change some of the SILC Net interfaces (see ~/silcnet).
 
 
- o Add DSS support.
+lib/silcmath
+============
 
 
- o SILC RNG does not implement random seed files, and they should be
-   implemented.
+ o The SILC MP API function must start returning indication of success
+   and failure of the operation.
 
 
- o Cipher optimizations (asm, that this) at least for i386 would be nice.
+ o Do SilcStack support for silc_mp_init, silc_mp_init_size and other
+   any other MP function (including utility ones) that may allocate
+   memory.
 
 
- o Add builtin SOCKS and HTTP Proxy support, well the SOCKS at least.
-   SILC currently supports SOCKS4 and SOCKS5 but it needs to be compiled
-   in separately.
+ o All utility functions should be made non-allocating ones.
 
 
- o Add a timeout to handling incoming JOIN commands.  It should be 
-   enforced that JOIN command is executed only once in a second or two
-   seconds.  Now it is possible to accept n incoming JOIN commands
-   and process them without any timeouts.  THis must be employed because
-   each JOIN command will create and distribute the new channel key
-   to everybody on the channel (Fix this to 0.9.x).
 
 
- o EPOC specific additions/changes required:
+lib/silcasn1                   ****PARTLY DONE****
+============
 
 
-       o lib/silcutil/epoc routines missing or not completed.
+ o ASN.1 library
 
 
-       o The PKCS#1 also calls global RNG (even though it is not used 
-         currently in SILC, the interface allows its use).
+ o Header documentation missing.
 
 
-       o Something needs to be thought to the logging globals as well, 
-         like silc_debug etc.  They won't work on EPOC.  Perhaps logging
-         and debugging is to be disabled on EPOC.
+ o Some string encodings missing (copy/paste matter).
 
 
- o Check whether we can fully comply with RFC 2779.
+
+lib/silcpkix
+============
+
+ o PKIX implementation
+
+
+lib/silcutil/silcfsm.[ch]
+=========================
+
+ o SILC Finite State Machine API.  Replaces SILC Protocol API,
+   (see ~silcfsm or ask Pekka).
+
+
+lib/silcutil/silcnet*, lib/silcutil/*/silc*net*
+===============================================
+
+ o Add UDP interface
+
+ o New network interfaces
+
+tyepdef enum {
+  SILC_NET_OK,
+  SILC_NET_UNKNOWN_IP,
+  SILC_NET_UNKNOWN_HOST,
+  SILC_NET_HOST_UNREACHABLE,
+  SILC_NET_CONNECTION_REFUSED,
+  SILC_NET_CONNECTION_TIMEOUT,
+  SILC_NET_NO_MEMORY,
+  SILC_NET_ERROR,
+} SilcNetStatus;
+
+/* A callback function of this type is returned by silc_net_create_server
+   and silc_net_create_connection_async.  For silc_net_create_server this
+   callback means that new incoming connection was accepted, and the
+   `stream' is the socket stream representing the socket connection.  For
+   silc_net_create_connection_async this means that we have connected to
+   the remote host and the `stream' is the socket stream for the socket
+   connection. */
+typedef void (*SilcNetCallback)(SilcNetStatus status,
+                               SilcStream stream, void *context);
+
+typedef SilcNetServerStruct *SilcNetServer;
+
+struct SilcNetServerStruct {
+  SilcNetCallback callback;
+  void *context;
+  int sock;
+  bool require_fqdn;
+};
+
+/* This function creates server or daemon or listener or what ever.  This
+   does not fork a new process, it must be done by the caller if caller
+   wants to create a child process.  This is used to create network
+   listener for incoming connections, and `callback' will be called
+   everytime new connection is received.  If `local_ip_addr' is NULL
+   any address is used.  If provided it can be used bind the server to
+   `local_ip_count' many IP addresses provided in `local_ip_addr' table.
+   On success returns the SilcNetServer context, or NULL on error.  If
+   `require_fqdn' is TRUE the server will require that the incoming
+   connection has FQDN to be able to connect. */
+SilcNetServer
+silc_net_create_server(const char **local_ip_addr, SilcUInt32 local_ip_count,
+                      int port, bool require_fqdn, SilcSchedule schedule,
+                      SilcNetCallback callback, void *context);
+
+/* Closes the server indicated by the `server'. */
+silc_net_close_server(SilcNetServer server);
+
+/* Creates TCP/IP connection to the remote host indicated by `remote_host'
+   which may be hostname or IP address, on the port indicated by `remote_port'.
+   If the `local_ip_addr' is provided the local host is bound to that address
+   before creating the connection.  This is synchronous call, and the
+   `callback' is called before this function returns.  The `callback'
+   delivers the SilcStream for the created connection. */
+SilcNetStatus
+silc_net_create_connection(const char *local_ip_addr,
+                          const char *remote_host, int remote_port,
+                          SilcNetCallback callback, void *context);
+
+/* Creates TCP/IP connection to the remote host indicated by `remote_host'
+   which may be hostname or IP address, on the port indicated by `remote_port'.
+   If the `local_ip_addr' is provided the local host is bound to that address
+   before creating the connection.  This is asynchronous call, and this
+   function returns before the connection is actually established.  The
+   `callback' will be called after the connection is created to deliver the
+   SilcStream for the created connection. */
+SilcAsyncOperation
+silc_net_create_connection_async(const char *local_ip_addr,
+                                const char *remote_ip_addr, int remote_port,
+                                SilcNetCallback callback, void *context);
+
+
+ o Other functions should remain as they are since these new functions have
+   to use them.  This way we also provide them for applications that want
+   to handle the sockets by themself.
+
+
+apps/silcd
+==========
+
+ o Remove the big switch statement from the function
+   silc_server_packet_parse_type and replace it with predefined
+   table of function pointers where each of the slot in table
+   represents the packet type value.
+
+   Same could be done with notify packets which has big switch
+   statement too.  Same kind of table of notify callbacks could be
+   done as well.
+
+ o The parser callback in the server will add a timeout task for
+   all packets.  It will require registering and allocating a
+   new task to the SilcSchedule.  Maybe, at least, for server
+   and router packets the parser would be called immediately
+   instead of adding it to the scheduler with 0 timeout.  It
+   should be analyzed too how slow the task registering process
+   actually is, and find out ways to optimize it.
+
+ o The SERVER_SIGNOFF notify handing is not optimal, because it'll
+   cause sending of multiple SIGNOFF notify's instead of the one
+   SERVER_SIGNOFF notify that the server received.  This should be
+   optimized so that the only SERVER_SIGNOFF is sent and not
+   SIGNOFF of notify at all (using SIGNOFF takes the idea about
+   SERVER_SIGNOFF away entirely).
+
+ o Another SERVER_SIGNOFF opt/bugfix:  Currently the signoff is
+   sent to a client if it is on same channel as the client that
+   signoffed.  However, the entire SERVER_SIGNOFF list is sent to
+   the client, ie. it may receive clients that was not on the
+   same channel.  This is actually against the specs.  It must be
+   done per channel.  It shouldn't receive the whole list just
+   because one client happened to be on same channel.
+
+ o MAYBE: The SilcChannelClientEntry can be:
+       SilcUInt32 address;
+       SilcUInt32 mode;
+
+  where address is SilcClientEntry address XOR SilcChannelEntry.
+  You can get SilcClientEntry by doing client = chl->address XOR channel,
+  and SilcChannelEntry by doing channel = chl->address XOR client.
+  As long as the other pointer is always available when accessing the
+  structure this can be done.
+
+ o Add reference counters to all Silc*Entry structures
+
+ o SERVICEs support (plugin, SIM)
+
+ o If client's public key is saved in the server (and doing public key
+   authentication) then the hostname and the username information could
+   be taken from the public key.  Should be a configuration option!
+
+ o Add a timeout to handling incoming JOIN commands.  It should be
+   enforced that JOIN command is executed only once in a second or two
+   seconds.  Now it is possible to accept n incoming JOIN commands
+   and process them without any timeouts.  THis must be employed because
+   each JOIN command will create and distribute the new channel key
+   to everybody on the channel (Fix this to 0.9.x).
 
  o The CMODE cipher & hmac change problem (#101).
 
  o The CMODE cipher & hmac change problem (#101).