updates.
[silc.git] / TODO
1 TODO for 1.2 And Beyond
2 =======================
3
4 NOTE: Any item that doesn't have (***DONE) in it, isn't done yet.  The
5 (***TESTING NEEDED) means that the item has been done but not yet properly
6 tested.
7
8 NOTE: A TODO entry does not mean that it is ever going to be done.  Some 
9 of the entries may be just ideas, good, bad or ugly.  If you want to work 
10 on some of the TODO entries simply let us know about it by dropping a note 
11 to silc-devel mailing list or appear on 'silc' channel on SILCNet.
12
13
14 General
15 =======
16
17  o Create apps/tutorial containing various Toolkit API tutorials.
18
19  o The Toolkit split.  The Toolkit is to be splitted in parts.  How many
20    parts and what the parts are isn't decided yet.  Each part is a separate
21    software package.  Current thinking is of the following:
22
23    SILC Toolkit                 SILC protocol, client and server library
24    SILC Runtime Toolkit         runtime library
25    SILC Crypto Toolkit          crypto, asn1, math, skr, pgp, etc.
26
27    The rationale for this is of course that other than SILC projects
28    might like to use the various libraries SILC Toolkit provides, but
29    naturally they don't want the bloat of SILC protocol related stuff.
30
31    The Runtime library in SILC Toolkit is a general purpose runtime library,
32    like Glib and APR are.  The runtime library is to be developed further
33    to provide alternative to Glib and APR.
34
35    The Crypto library in SILC Toolkit is a general purpose crypto library
36    providing pretty nice APIs compared to many other crypto libraries,
37    especially OpenSSL.  The Crypto library is to be developed further
38    to include support for OpenPGP, X.509 and SSH2.
39
40
41 lib/silccore
42 ============
43
44  o SILC_PACKET_FLAG_ACK support.  Implement ACK packet and packet payload
45    to silcpacket.c.
46
47  o All payload encoding routines should take SilcStack as argument.
48
49  o All payload test routines into lib/silccore/tests/.
50
51
52 lib/silcclient, The Client Library
53 ==================================
54
55  o peer-to-peer private messages
56
57  o Private message key request notification to application.  See XXX in
58    client_prvmsg.c.
59
60  o in JOIN notify handle resolving that timedout.  Currently the user is
61    never joined the channel if this happens.  What to do if message is
62    received from user that hasn't been resolved/joined?
63
64  o Message ACKing support.
65
66  o in /cmode and /cumode with +r, maybe the public key and private key
67    could be just some "string", which would then match to "string.pub" and
68    "string.prv".
69
70
71 Runtime library, lib/silcutil/
72 ==============================
73
74  o Fix universal time decoding (doesn't accept all formats) in silctime.c.
75
76  o Add functions to manipulate environment variables.
77
78    SilcBool silc_setenv(const char *variable, const char *value);
79    const char *silc_getenv(const char *variable);
80    SilcBool silc_clearenv(const char *variable);
81
82  o Add functions to loading shared/dynamic object symbols (replaces the
83    SIM library (lib/silcsim) and introduces generic library).
84
85    SilcDll silc_dll_load(const char *object_path, SilcDllFlags flags);
86    void silc_dll_close(SilcDll dll);
87    void *silc_dll_getsym(SilcDll dll, const char *symbol);
88    const char *silc_dll_error(SilcDll dll);
89
90  o Add directory opening/traversing functions
91
92  o silc_getopt routines
93
94  o silc_hash_table_replace -> silc_hash_table_set.  Retain support for
95    silc_hash_table_replace as macro.
96
97  o The SILC Event signals.  Asynchronous events that can be created,
98    connected to and signalled.  Either own event routines or glued into
99    SilcSchedule:
100
101    SilcTask silc_schedule_task_add_event(SilcSchedule schedule,
102                                          const char *event, ...);
103    SilcBool silc_schedule_event_connect(SilcSchedule schedule,
104                                         const char *event,
105                                         SilcTaskCallback event_callback,
106                                         void *context);
107    SilcBool silc_schedule_event_signal(SilcSchedule schedule,
108                                        const char *event, ...);
109
110    Example:
111      silc_schedule_task_add_event(schedule, "connected",
112                                   SILC_PARAM_UI32_INT,
113                                   SILC_PARAM_BUFFER,
114                                   SILC_PARAM_END);
115      silc_schedule_event_connect(schedule, "connected", connected_cb, ctx);
116      silc_schedule_event_signal(schedule, "connected", integer, buf,
117                                  SILC_PARAM_END);
118      SILC_TASK_CALLBACK(connected_cb)
119      {
120        FooCtx ctx = context;
121        va_list args;
122        SilcUInt32 integer;
123        SilcBuffer buf;
124  
125        va_start(args, context);
126        integer = va_arg(args, SilcUInt32);
127        buf = va_arg(args, SilcBuffer);
128        va_end(args);
129        ...
130      }
131
132    Problems: Events would be SilcSchedule specific, and would not work on 
133    multi-thread/multi-scheduler system.  The events should be copyable 
134    between schedulers.
135
136  o Structured log messages to Log API.  Allows machine readable log
137    messages.  Would allow sending of any kind of data in a log message.
138
139  o Base64 to an own API
140
141  o Timer API
142
143  o Add builtin SOCKS and HTTP Proxy support, well the SOCKS at least.
144    SILC currently supports SOCKS4 and SOCKS5 but it needs to be compiled
145    in separately.
146
147  o silc_stringprep to non-allocating version.
148
149  o SilcStack aware SilcHashTable.
150
151  o SilcStack aware SilcDList.
152
153  o Thread pool API.
154
155    typedef void (*SilcThreadPoolFunc)(SilcSchedule schedule,
156                                       void *context);
157
158    /* Allocate thread pool with at least `min_threads' and at most
159       `max_threads' many threads.  If `stack' is non-NULL all memory
160       is allocated from the `stack'.  If `start_min_threads' is TRUE
161       this will start `min_threads' many threads immediately. */
162    SilcThreadPool silc_thread_pool_alloc(SilcStack stack,
163                                          SilcUInt32 min_threads,
164                                          SilcUInt32 max_threads,
165                                          SilcBool start_min_threads);
166
167    /* Free thread pool.  If `wait_unfinished' is TRUE this will block
168       and waits that all remaining active threads finish before freeing
169       the pool. */
170    void silc_thread_pool_free(SilcThreadPool tp, SilcBool wait_unfinished);
171
172    /* Run `run' function with `run_context' in one of the threads in the
173       thread pool.  Returns FALSE if the thread pool is being freed.  If
174       there are no free threads left in the pool this will queue the
175       the `run' and will call it once a thread becomes free.
176
177       If `completion' is non-NULL it will be called to indicate completion
178       of the `run' function.  If `schedule' is non-NULL the `completion'
179       will be called through the scheduler in the main thread.  If it is
180       NULL the `completion' is called directly from the thread after the
181       `run' has returned. */
182    SilcBool silc_thread_pool_run(SilcThreadPool tp,
183                                  SilcSchedule schedule,
184                                  SilcThreadPoolFunc run,
185                                  void *run_context,
186                                  SilcThreadPoolFunc completion,
187                                  void *completion_context);
188
189    /* Modify the amount of maximum threads of the pool. */
190    void silc_thread_pool_set_max_threads(SilcThreadPool tp,
191                                          SilcUInt32 max_threads);
192
193    /* Returns the amount of maximum size the pool can grow. */
194    SilcUInt32 silc_thread_pool_get_max_threads(SilcThreadPool tp);
195
196    /* Returns the amount of free threads in the pool currently. */
197    SilcUInt32 silc_thread_pool_get_free_threads(SilcThreadPool tp);
198
199    /* Stops all free and started threads.  The minumum amount of threads
200       specified to silc_thread_pool_alloc always remains. */
201    void silc_thread_pool_stop_free_threads(SilcThreadPool tp);
202
203  o Fast mutex implementation.  Fast rwlock implementation.  Mutex and
204    rwlock implementation using atomic operations.
205
206  o Compression routines are missing.  The protocol supports packet
207    compression thus it must be implemented.  SILC Zip API must be
208    defined.
209
210  (o Generic SilcStatus or SilcResult that includes all possible status and 
211     error conditions, including those of SILC protocol.  Though, the SILC
212     protocol related status (currently in silcstatus.h) cannot be in 
213     runtime library) maybe
214
215  (o SILC specific socket creation/closing routines to silcnet.h, wrappers
216   to all send(), recv(), sendto() etc.  Bad thing is that we'd have to
217   define all socket options, sockaddrs, etc.) maybe
218
219  (o mmap) maybe
220
221
222 lib/silcutil/symbian/
223 =====================
224
225  o Something needs to be thought to the logging globals as well,
226    like silc_debug etc.  They won't work on EPOC.  Perhaps logging
227    and debugging is to be disabled on EPOC.  The logging currently works
228    by it cannot be controlled, same with debugging.
229
230
231 SFTP Library, lib/silcsftp/
232 ===========================
233
234  o Read prefetch (read-ahead, reading ahead of time).  Maybe if this can
235    be done easily.
236
237
238 SKR Library, lib/silcskr/
239 =========================
240
241  o Add fingerprint as search constraint.
242
243  o Add OpenPGP support.  Adding, removing, fetching PGP keys.  (Keyring
244    support?)
245
246  o Add support for importing public keys from a directory and/or from a
247    file.  Add support for exporting the repository (different formats for
248    different key types?).
249
250  o Change the entire silc_skr_find API.  Remove SilcSKRFind and just simply
251    add the find constraints as variable argument list to silc_skr_find, eg:
252
253   silc_skr_find(skr, schedule, callback, context,
254                 SILC_SKR_FIND_PUBLIC_KEY, public_key,
255                 SILC_SKR_FIND_COUNTRY, "FI",
256                 SILC_SKR_FIND_USAGE, SILC_SKR_USAGE_AUTH,
257                 SILC_SKR_FIND_END);
258
259    NULL argument would be ignored and skipped.
260
261  o Add OR logical rule in addition of the current default AND, eg:
262
263   // Found key(s) MUST have this public key AND this country.
264   silc_skr_find(skr, schedule, callback, context,
265                 SILC_SKR_FIND_RULE_AND,
266                 SILC_SKR_FIND_PUBLIC_KEY, public_key,
267                 SILC_SKR_FIND_COUNTRY, "FI",
268                 SILC_SKR_FIND_END);
269
270   // Found key(s) MUST have this public key OR this key context
271   silc_skr_find(skr, schedule, callback, context,
272                 SILC_SKR_FIND_RULE_OR,
273                 SILC_SKR_FIND_PUBLIC_KEY, public_key,
274                 SILC_SKR_FIND_CONTEXT, key_context,
275                 SILC_SKR_FIND_END);
276
277
278 Crypto Library, lib/silccrypt/
279 ==============================
280
281  o Add fingerprint to SilcSILCPublicKey and retrieval to silcpk.h, and
282    possibly to silcpkcs.h.
283
284    /* Return fingerprint of the `public_key'.  Returns also the algorithm
285       that has been used to make the fingerprint. */
286    const unsigned char *
287    silc_pkcs_get_fingerprint(SilcPublicKey public_key,
288                              const char **hash_algorithm,
289                              SilcUInt32 *fingerprint_len);
290
291  o Change SILC PKCS API to asynchronous, so that accelerators can be used.
292    All PKCS routines should now take callbacks as argument and they should
293    be delivered to SilcPKCSObject and SilcPKCSAlgorithm too.
294
295    /* Signature computation callback */
296    typedef void (*SilcPKCSSignCb)(SilcBool success,
297                                   const unsigned char *signature,
298                                   SilcUInt32 signature_len,
299                                   void *context);
300
301    /* Signature verification callback */
302    typedef void (*SilcPKCSVerifyCb)(SilcBool success, void *context);
303
304    /* Encryption callback */
305    typedef void (*SilcPKCSEncryptCb)(SilcBool success,
306                                      const unsigned char *encrypted,
307                                      SilcUInt32 encrypted_len,
308                                      void *context);
309
310    /* Decryption callback */
311    typedef void (*SilcPKCSDecryptCb)(SilcBool success,
312                                      const unsigned char *decrypted,
313                                      SilcUInt32 decrypted_len,
314                                      void *context);
315
316    Either add new _async functions or add the callbacks to existing API
317    and if the callback is NULL then the API is not async and if provided
318    it may be async.  For example;
319
320    SilcBool silc_pkcs_sign(SilcPrivateKey private_key,
321                            unsigned char *src, SilcUInt32 src_len,
322                            unsigned char *dst, SilcUInt32 dst_size,
323                            SilcUInt32 *dst_len,
324                            SilcBool compute_hash, SilcHash hash,
325                            SilcPKCSSignCb async_sign,
326                            void *async_sign_context);
327
328    (if this is done then there's no reason why the buffers in the 
329     callbacks cannot be the ones user gives here) or allow only async:
330
331    SilcBool silc_pkcs_sign(SilcPrivateKey private_key,
332                            unsigned char *src, SilcUInt32 src_len,
333                            SilcBool compute_hash, SilcHash hash,
334                            SilcPKCSSignCb async_sign,
335                            void *async_sign_context);
336
337    or add new:
338
339    SilcBool silc_pkcs_sign_async(SilcPrivateKey private_key,
340                                  unsigned char *src, SilcUInt32 src_len,
341                                  SilcBool compute_hash, SilcHash hash,
342                                  SilcPKCSSignCb async_sign,
343                                  void *async_sign_context);
344
345  o Change PKCS Algorithm API to take SilcPKCSAlgorithm as argument to
346    encrypt, decrypt, sign and verify functions.  We may need to for exmaple
347    check the alg->hash, supported hash functions.  Maybe deliver it also
348    to all other functions in SilcPKCSAlgorithm to be consistent.
349
350  o Add DSS support.  Take implementation from Tom or make it yourself.
351
352  o Implement the defined SilcDH API.  The definition is in
353    lib/silccrypt/silcdh.h.
354
355  o All cipher, hash, hmac etc. allocation routines should take their name
356    in as const char * not const unsigned char *.
357
358  o ECDSA and ECDH
359
360
361 SILC Accelerator Library
362 ========================
363
364  o SILC Accelerator API.  Provides generic way to use different kind of
365    accelerators.  Basically implements SILC PKCS API so that SilcPublicKey
366    and SilcPrivateKey can be used but they call the accelerators.
367
368    Something in the lines of (preliminary):
369
370    /* Register accelerator to system */
371    SilcBool silc_acc_register(const SilcAccelerator acc);
372
373    /* Unregister accelerator */
374    SilcBool silc_acc_unregister(const SilcAccelerator acc);
375
376    /* Find existing accelerator.  `name' is accelerators name and
377       `params' is optional accelerator specific parameters. */
378    SilcAccelerator silc_acc_find(const char *name, const char *params);
379
380    /* Return accelerator's displayable name */
381    const char *silc_ac_get_display_name(SilcAccelerator acc);
382
383    /* Accelerate `public_key'.  Return accelerated public key. */
384    SilcPublicKey silc_acc_public_key(SilcAccelerator acc,
385                                      SilcPublicKey public_key);
386
387    /* Accelerate `private_key'.  Returns accelerated private key. */
388    SilcPrivateKey silc_acc_private_key(SilcAccelerator acc,
389                                        SilcPrivateKey private_key);
390
391    /* Return the underlaying public key */
392    SilcPublicKey silc_acc_get_public_key(SilcAccelerator acc,
393                                          SilcPublicKey public_key);
394
395    /* Return the underlaying private key */
396    SilcPrivateKey silc_acc_get_private_key(SilcAccelerator acc,
397                                            SilcPrivateKey private_key);
398
399    typedef struct SilcAcceleratorObject {
400      const char *name;                          /* Accelerator's name */
401      const char *display_name;                  /* Displayable name */
402      SilcAcceleratorType type;                  /* Accelerator type */
403      union {
404        struct {
405          SilcPKCSObject *pkcs;                  /* Accelerator PKCS*/
406          SilcPKCSAlgorithm *algorithm;          /* Accelerator Alg, may be 
407                                                    NULL */
408        } pkcs;
409
410        struct {
411
412        } cipher;
413      } u;
414    } *SilcAccelerator, SilcAcceleratorStruct;
415
416    SilcPublicKey->SilcSILCPublicKey->RsaPublicKey accelerated as:
417    SilcPublicKey->SilcAcceleratorSoftware->SilcSILCPublicKey->RsaPublicKey or
418    SilcPublicKey->SilcAcceleratorPublicKey->SilcAcceleratorSoftware->
419      SilcSILCPublicKey->RsaPublicKey
420
421    The former one if u.pkcs.algorithm == NULL.
422
423  o Implement software accelerator.  It is a thread pool system where the
424    public key and private key operations are executed in threads.
425
426    This implements SilcPKCSAlgorithm (and SilcPKCSObject if needed) that 
427    implements the thread acclerated system.
428
429  (o Symmetric key cryptosystem acceleration?  They are always sycnhronouos
430    even with hardware acceleration so the crypto API shouldn't require
431    changes.) maybe
432
433
434 lib/silcmath
435 ============
436
437  o Import TFM.  Talk to Tom to add the missing functions.  Use TFM in
438    client and client library, but TMA in server, due to the significantly
439    increased memory consumption with TFM, and the rare need for public
440    key operations in server.
441
442    We want TFM's speed but not TFM's memory requirements.  Talk to Tom
443    about making the TFM mp dynamic just as it is in LTM.
444
445  o The SILC MP API function must start returning indication of success
446    and failure of the operation.
447
448  o Do SilcStack support for silc_mp_init, silc_mp_init_size and other
449    any other MP function (including utility ones) that may allocate
450    memory.
451
452  o All utility functions should be made non-allocating ones.
453
454
455 SILC XML Library, lib/silcxml/
456 ==============================
457
458  o SILC XML API (wrapper to expat).  The SILC XML API should follow and 
459    resemble Simple API for XML (SAX).
460
461
462 lib/silcske/silcske.[ch]
463 ========================
464
465  o Ratelimit to UDP/IP transport for incoming packets.
466
467
468 lib/silcasn1
469 ============
470
471  o Negative integer encoding is missing, add it.
472
473  o SILC_ASN1_CHOICE should perhaps return an index what choice in the
474    choice list was found.  Currently it is left for caller to figure out
475    which choice was found.
476
477  o SILC_ASN1_NULL in decoding should return SilcBool whether or not
478    the NULL was present.  It's important when it's SILC_ASN1_OPTIONAL
479    and we need to know whether it was present or not.
480
481
482 lib/silcpgp
483 ===========
484
485  o OpenPGP certificate support, allowing the use of PGP public keys
486    in SILC.
487
488
489 lib/silcssh
490 ===========
491
492  o SSH2 public key/private key support, allowing the use of SSH2 keys
493    in SILC.  RFC 4716.
494
495
496 lib/silcpkix
497 ============
498
499  o PKIX implementation
500
501
502 lib/silcserver
503 ==============
504
505  o (Re)write commands/command replys.
506
507  o (Re)write notify handling.
508
509  o The SERVER_SIGNOFF notify handing is not optimal, because it'll
510    cause sending of multiple SIGNOFF notify's instead of the one
511    SERVER_SIGNOFF notify that the server received.  This should be
512    optimized so that the only SERVER_SIGNOFF is sent and not
513    SIGNOFF of notify at all (using SIGNOFF takes the idea about
514    SERVER_SIGNOFF away entirely).
515
516  o Another SERVER_SIGNOFF opt/bugfix:  Currently the signoff is
517    sent to a client if it is on same channel as the client that
518    signoffed.  However, the entire SERVER_SIGNOFF list is sent to
519    the client, ie. it may receive clients that was not on the
520    same channel.  This is actually against the specs.  It must be
521    done per channel.  It shouldn't receive the whole list just
522    because one client happened to be on same channel.
523
524  o Add reference counters to all Silc*Entry structures
525
526  o SERVICEs support (plugin, SIM)
527
528  o If client's public key is saved in the server (and doing public key
529    authentication) then the hostname and the username information could
530    be taken from the public key.  Should be a configuration option!
531
532  o Add a timeout to handling incoming JOIN commands.  It should be
533    enforced that JOIN command is executed only once in a second or two
534    seconds.  Now it is possible to accept n incoming JOIN commands
535    and process them without any timeouts.  THis must be employed because
536    each JOIN command will create and distribute the new channel key
537    to everybody on the channel.
538
539  o Related to above.  If multiple JOINs are received in sequence perhaps
540    new key should be created only once, if the JOINs are handeled at the same
541    time.  Now we create multiple keys and never end up using them because
542    many JOINs are processed at the same time in sequence.  Only the last
543    key ends up being used.
544
545  o The CMODE cipher & hmac change problem (#101).