updates.
[silc.git] / TODO
1 TODO for 1.1 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
9 apps/silcd, The SILC Server     ****PARTLY DONE****
10 ===========================
11
12  o Port all code to use SILC Toolkit 1.1 APIs.
13
14  o Remove protocol.[ch].
15
16  o Rewrite connecting accepting.
17
18  o Rewrite async connecting
19
20  o Connecting from SILC router to SILC server.
21
22  o Rewrite rehash, HUP.
23
24  o Add Web statistics module using lib/silchttp.  Give out server
25    statistics.
26
27
28 SILC Client     ****PARTLY DONE****
29 ===========
30
31  o Porting to new Toolkit API and new Client Library API (***TESTING NEEDED)
32
33  o Improve help files, especially /cmode, /cumode and /key.
34
35
36 lib/silcclient, The Client Library      ***PARTLY DONE****
37 ==================================
38
39  o in JOIN notify handle resolving that timedout.  Currently the user is
40    never joined the channel if this happens.  What to do if message is
41    received from user that hasn't been resolved/joined?  (maybe 1.1, latest
42    1.2)
43
44  o silcclient.h clean up and API rewrites.
45
46  o silcclient_entry.h finishing, all entry relates APIs to this header.
47
48  o SilcChannelEntry, SilcServerEntry, SilcChannelUser, allocating,
49    freeing, finding, etc. rewrite.  Also making them reference counted for
50    multi threads use. (***DONE)
51
52  o Rewrite silc_client_get_clients_by_channel.
53
54  o Rewrite client side WHOIS command (for whois -details). (***DONE)
55
56  o Finish all the missing SILC packet processings, rewrites. (***DONE)
57
58  o The client_notify.c rewrite. (***DONE)
59
60  o Resuming to client_register.c (remove client_resume.c) (***DONE)
61
62  o Rekey rewrite. (***DONE)
63
64  o Remove protocol.[ch]. (***DONE)
65
66  o File transfer rewrite. (***DONE)
67
68  o File transfer API documentation.
69
70  o Connection auth request. (***DONE)
71
72  o Password auth test, public key auth test.
73
74  o Starting key exchange directly, rewrite. (***DONE)
75
76  o Channel messages, channel private keys, channel entires, channel
77    search, etc. rewrite. (***TESTING NEEDED)
78
79  o For many APIs leave the hash context allocations to the caller instead
80    of using client->sha1hash and client->md5hash, or some kind of thread
81    safe (no locking) concept. (***DONE)
82
83  o Key agreement rewrite. (***TESTING NEEDED)
84
85  o Connecting to remote client (***DONE)
86
87  o peer-to-peer private messages
88
89  o Private message waiting API (in threads) (***TESING NEEDED)
90
91  o client_attrs.c, attributes rewrite. (***TESTING NEEDED)
92
93  o No SilcBuffer lists back to application in command_reply operations.
94    Convert them all to real lists and/or structures for easier use.
95    (***DONE)
96
97  o Nickname formatting rewrite. (***TESTING NEEDED)
98
99  o UDP connections. (***TESTING NEEDED)
100
101  o Message ACKing.
102
103  o in /cmode and /cumode with +r, maybe the public key and private key
104    could be just some "string", which would then match to "string.pub" and
105    "string.prv".
106
107  o All packet waiting timeout tests and error condition tests.
108
109
110 lib/silcsftp                    ****DONE****
111 ============
112
113  o Porting to use the new util library. (***DONE)
114
115  o Read-ahead (1.2)
116
117
118 lib/silccore/silcpacket.[ch]    ****PARTLY DONE****
119 ============================
120
121  o Implement silc_packet_engine_stop and silc_packet_stream_destroy.
122
123  o Implement ACK packet and packet payload.
124
125  o SilcPacketEngine. (***DONE)
126
127  o New SILC Packet API. (***DONE)
128
129
130 lib/silccore/silcpacket.[ch]    ****PARTLY DONE****
131 ============================
132
133  o IV Included flag support, UDP transport support (***TESTING NEEDED)
134
135  o SILC_PACKET_FLAG_ACK support.
136
137
138 lib/silccore/silcid.[ch]        ****DONE****
139 ========================
140
141  o Add silc_id_str2id to accept the destination buffer as argument
142    and thus not require any memory allocation.  Same will happen
143    with silc_id_payload_* functions. (***DONE)
144
145  o silc_id_str2id, silc_id2str to non-allocating routines. (***DONE)
146
147
148 lib/silcskr
149 ===========
150
151  o Removing key from the repository is not possible currently.  It should
152    be.
153
154  o Add fingerprint as search constraint.
155
156
157 lib/silcske/silcske.[ch]        ***PARTLY DONE****
158 ========================
159
160  o Ratelimit to UDP/IP transport for incoming packets.
161
162  o IV Included flag support in SKE (***DONE)
163
164  o UDP transport changes; retransmission support by using exponential
165    backoff algorithm. (***DONE)
166
167  o SilcConnAuth header file documentation. (***DONE)
168
169
170 lib/silccrypt                   ****PARTLY DONE****
171 =============
172
173  o Implement SILC Public Key Version 2 handling in sign/verify.  Implement
174    Version (V) identifier (***DONE)
175
176  o Add fingerprint to SilcSILCPublicKey and retrieval to silcpk.h.
177
178  o Implement PKCS #1 sign/verify with hash OID. (***TESTING NEEDED)
179
180  o SILC PKCS (silcpkcs.h) reorganizing when other PK supports added.
181    Move the SILC Public Key routines away from the crypto library into
182    the core library (silccore).  silc_pkcs_public/private_key_* routines
183    to silc_public/private_key_* routines.  The silc_public_key_* routines
184    should also automatically handle SILC Public Keys, and other keys
185    and certificates as well.  Add fe. silcpk.h into silccore.  It should
186    also include the Public Key Payload encoding and decoding routines.
187    (***DONE)
188
189  o Assembler AES (***DONE)
190
191  o Implement the defined SilcDH API.  The definition is in
192    lib/silccrypt/silcdh.h. (1.2)
193
194  o SSH2 public keys support, allowing the use of SSH2 public keys in
195    SILC. (1.2)
196
197  o Add DSS support (1.2)
198
199  o ECDSA and ECDH (1.2)
200
201
202 lib/silcutil                    ****PARTLY DONE****
203 ============
204
205  o The regex code from lib/contrib might compile fine on all platforms.
206    No need to make it silcutil/unix/ specific.  Add them to generic
207    silcutil.c.
208
209  o silc_stringprep to non-allocating version.
210
211  o Compression routines are missing.  The protocol supports packet
212    compression thus it must be implemented.  SILC Zip API must be
213    defined.
214
215  o bool -> SilcBool (***DONE)
216
217  o Silc FD Stream to WIN32 (lib/silcutil/silcfdstream.h)
218
219  o Add builtin SOCKS and HTTP Proxy support, well the SOCKS at least.
220    SILC currently supports SOCKS4 and SOCKS5 but it needs to be compiled
221    in separately. (1.2)
222
223
224 lib/silcutil/silcbuffer.h       ****DONE****
225 =========================
226
227  o Remove the `truelen' field from SilcBuffer as it is entirely
228    redundant since we can get the true length of the buffer by
229    doing buffer->end - buffer->header.  Add silc_buffer_truelen
230    macro instead.  Consider also removing `len' field too since
231    it effectively is buffer->tail - buffer->data, and adding
232    silc_buffer_len macro can do the same.  These would save
233    totally 8 bytes of memory per buffer. (***DONE)
234
235
236 lib/silcutil/silcbuffmt.[ch]    ****DONE****
237 ============================
238
239  o SilcStack aware silc_buffer_unformat (***DONE)
240
241  o SilcStack aware silc_buffer_format (***DONE)
242
243  o silc_buffer_format reallocates automatically (***DONE)
244
245  o SILC_STR_OFFSET (***DONE)
246
247
248 lib/silcutil/silcstack.[ch]     ****DONE****
249 ===========================
250
251  o Data stack implementation (***DONE)
252
253
254 lib/silcutil/silcstream.[ch]    ****DONE****
255 ============================
256
257  o Add abstract SilcStream. (***DONE)
258
259
260 lib/silcutil/silcsocketstream.[ch]      ****PARTY DONE****
261 ==================================
262
263  o Add SilcSocketStream (***DONE)
264
265  o Add SilcSocketStream for WIN32
266
267  o Handle EOS sending to upper layer properly
268
269  o Test QoS after the changes made to socket stream
270
271
272 lib/silcutil/silcschedule*.[ch]         ****PARTLY DONE****
273 ===============================
274
275  o Scheduler can be optimized for FD tasks by changing the fd_queue
276    to SilcHashTable instead of using linked list.  We need to do
277    one-to-one mapping of FD to task and hash table is more efficient
278    for this usage.
279
280    Also redefine the silc_select to perhaps return a separate
281    structure of the events that actually occurred, instead of
282    returning the events in the fd_list which is then traversed
283    in the generic code to find the changed events.  This can be
284    made faster by having own struct which includes only the
285    changed events, thus the tarversing is faster since the whole
286    fd_list is not traversed anymore (it is still traversed in the
287    silc_select but at least it removes one extra tarversing later
288    for the same list).
289
290    Other task queues should be changed to use SilcList.  (***DONE)
291
292  o Add SILC scheduler's internal routines into a table of implementation
293    function pointers, that the generic code then takes as extern from
294    implementation.  These are the silc_schedule_internal_* routines.
295    (***DONE)
296
297  o Change SILC_TASK_CALLBACK to non-static, and remove the macro
298    SILC_TASK_CALLBACK_GLOBAL. (***DONE)
299
300  o SILC Schedule API changes to WIN32.
301
302
303 lib/silcutil/silcasync.[ch]     ****DONE****
304 ===========================
305
306  o Add SilcAsyncOperation to utility library.  Any function that takes
307    callback as an argument must/should return SilcAsyncOperation.
308    (***DONE)
309
310
311 lib/silcutil/silctime.[ch]      ****PARTLY DONE****
312 ===========================
313
314  o SilcTime. (***DONE)
315
316  o system time, universal, generalized. (***DONE)
317
318  o Fix universal time decoding (doesn't accept all forms) in silctime.c.
319
320
321 lib/silcutil/silcfsm.[ch]       ****DONE****
322 =========================
323
324  o SILC Finite State Machine API.  Replaces SILC Protocol API (***DONE)
325
326
327 lib/silcutil/silcnet*, lib/silcutil/*/silc*net*         ****PARTLY DONE****
328 ===============================================
329
330  o Add UDP interface (***DONE)
331
332  o Add UDP interface for WIN32
333
334  o New network interfaces (***DONE)
335
336
337 lib/silcmath
338 ============
339
340  o Import TFM.  Talk to Tom to add the missing functions.  Use TFM in
341    client and client library, but TMA in server, due to the significantly
342    increased memory consumption with TFM, and the rare need for public
343    key operations in server.
344
345  o Change LTM and TFM function names when importing to SILC tree to avoid
346    rare linking problems on system that has same named symbols already in
347    the system.
348
349  o The SILC MP API function must start returning indication of success
350    and failure of the operation.
351
352  o Do SilcStack support for silc_mp_init, silc_mp_init_size and other
353    any other MP function (including utility ones) that may allocate
354    memory.
355
356  o Test on x86_64.
357
358  o All utility functions should be made non-allocating ones.
359
360
361 lib/silcutil/symbian/           ****PARTLY DONE****
362 =====================
363
364   o lib/silcutil/symbian routines missing or not completed.
365     (****TESTING NEEDED)
366
367   o Something needs to be thought to the logging globals as well,
368     like silc_debug etc.  They won't work on EPOC.  Perhaps logging
369     and debugging is to be disabled on EPOC.
370
371
372 lib/silcasn1                    ****PARTLY DONE****
373 ============
374
375  o ASN.1 library (***DONE)
376
377  o Header documentation missing. (***DONE)
378
379  o Some string encodings missing (copy/paste matter). (***DONE)
380
381  o Negative integer encoding
382
383
384 lib/silccore
385 ============
386
387  o All payload encoding routines should take SilcStack as argument. (1.2)
388
389  o All payload test routines into lib/silccore/tests/.
390
391
392 lib/silcpkix (1.2)
393 ============
394
395  o PKIX implementation
396
397
398 lib/silcpgp (1.2)
399 ===========
400
401  o OpenPGP certificate support, allowing the use of PGP public keys
402    in SILC.
403
404
405 lib/silcserver (1.2)
406 ==============
407
408  o (Re)write commands/command replys.
409
410  o (Re)write notify handling.
411
412  o The SERVER_SIGNOFF notify handing is not optimal, because it'll
413    cause sending of multiple SIGNOFF notify's instead of the one
414    SERVER_SIGNOFF notify that the server received.  This should be
415    optimized so that the only SERVER_SIGNOFF is sent and not
416    SIGNOFF of notify at all (using SIGNOFF takes the idea about
417    SERVER_SIGNOFF away entirely).
418
419  o Another SERVER_SIGNOFF opt/bugfix:  Currently the signoff is
420    sent to a client if it is on same channel as the client that
421    signoffed.  However, the entire SERVER_SIGNOFF list is sent to
422    the client, ie. it may receive clients that was not on the
423    same channel.  This is actually against the specs.  It must be
424    done per channel.  It shouldn't receive the whole list just
425    because one client happened to be on same channel.
426
427  o MAYBE: The SilcChannelClientEntry can be:
428         SilcUInt32 address;
429         SilcUInt32 mode;
430
431   where address is SilcClientEntry address XOR SilcChannelEntry.
432   You can get SilcClientEntry by doing client = chl->address XOR channel,
433   and SilcChannelEntry by doing channel = chl->address XOR client.
434   As long as the other pointer is always available when accessing the
435   structure this can be done.
436
437  o Add reference counters to all Silc*Entry structures
438
439  o SERVICEs support (plugin, SIM)
440
441  o If client's public key is saved in the server (and doing public key
442    authentication) then the hostname and the username information could
443    be taken from the public key.  Should be a configuration option!
444
445  o Add a timeout to handling incoming JOIN commands.  It should be
446    enforced that JOIN command is executed only once in a second or two
447    seconds.  Now it is possible to accept n incoming JOIN commands
448    and process them without any timeouts.  THis must be employed because
449    each JOIN command will create and distribute the new channel key
450    to everybody on the channel (Fix this to 0.9.x).
451
452  o Related to above.  If multiple JOINs are received in sequence perhaps
453    new key should be created only once, if the JOINs are handeled at the same
454    time.  Now we create multiple keys and never end up using them because
455    many JOINs are processed at the same time in sequence.  Only the last
456    key ends up being used.
457
458  o The CMODE cipher & hmac change problem (#101).