Added.
[silc.git] / lib / doc / porting.html
1 <big><b>Porting from Toolkit 1.0 to 1.1</b></big>
2
3 <br />&nbsp;<br />
4 This documents describes the differences between the SILC Toolkit 1.0 and
5 1.1 and should help application programmers to port their SILC applications
6 to the new Toolkit version.
7
8 <br />&nbsp;<br />
9 <li><a href="#general">General</a><br />
10 <li><a href="#client">Client library</a><br />
11 <li><a href="#util">Utility library</a><br />
12 <li><a href="#apputil">Application utility library</a>
13 <li><a href="#crypto">Crypto library</a>
14 <li><a href="#skr">Key Repository library</a>
15 <li><a href="#vcard">VCard library</a>
16 <li><a href="#http">HTTP library</a>
17 <li><a href="#asn1">ASN.1 library</a>
18 <li><a href="#other">Other libraries</a>
19
20 <br />&nbsp;<br />
21 <h3><a name="general"></a>General changes</h3>
22
23 The main SILC Toolkit header file has changed its name from silcincludes.h
24 to silc.h.  The first task in porting from 1.0 to 1.1 is to change these
25 filenames in your source tree.
26
27
28 <br />&nbsp;<br />
29 <h3><a name="client"></a>Client library, lib/silcclient/</h3>
30
31 The client library in Toolkit 1.1 has been partially rewritten.  It was
32 rewritten to work out some technical issues and to increase performance
33 and decrease memory consumption.  The client library API has also faced
34 some changes, altough most of it has remained the same.  Most major change
35 in the client library is that is now fully supports multiple threads.  In
36 the past making multithreaded SILC client application was always a bit hard
37 but with Toolkit 1.1 it should be relatively straightforward.
38
39 <h4>SilcClientOperations structure</h4>
40
41 The SilcClientOperation structure has changed significantly.  It no longer
42 has `connected', `disconnected' and `failure' function pointers.  Instead a
43 new SilcClientConnectCallback has been defined that is given as argument to
44 functions like silc_client_connect_to_server, silc_client_connect_to_client
45 and silc_client_key_exchange (last two being entirely new functions in the
46 API).  That callback is called when connection is established and when it
47 is disconnected, or if a protocol failure occurred during connecting.  That
48 callback also delivers a detailed error information when error occurs.  New
49 connection related status types in SilcClientConnectionStatus has also been
50 added, see the API for the details.
51
52 <br />&nbsp;<br />
53 Also the `detach' client operation function pointer has been removed.  Instead
54 the detachment data is now simply delivered in the SILC_COMMNAD_DETACH
55 command reply.
56
57 <br />&nbsp;<br />
58 Some of the remaining client operation function pointers have changed a bit.
59 Most major change is the `command' operation now having the arguments that
60 user gave on the user interface sent back to application.  The `command_reply'
61 does not anymore include the SilcCommandPayload as an argument.  Also the
62 variable argument lis is now delivered as va_list.  Also the boolean
63 success indicator is removed and SilcStatus error argument instead is telling
64 the exact error if the SilcStatus status is other than SILC_STATUS_OK.
65
66 <br />&nbsp;<br />
67 The `get_auth_method' client operation now includes the authentication method
68 that has been resolved from the remote server.  The application no longer
69 needs to resolve it and the function silc_client_request_authentication_method
70 has been removed from the API.
71
72 <br />&nbsp;<br />
73 The `verify_public_key' client operation now include the SilcPublicKey pointer
74 instead of the public key in raw encoded form.  Also the connection type
75 argument has changed to SilcConnectionType.
76
77 <br />&nbsp;<br />
78 The `key_agreement' client operation now includes a new protocol argument
79 which tells whether the key agremeent is supposed to be done on TCP or on
80 UDP transport.  The new Toolkit 1.1 supports both.
81
82 <h4>SilcClient</h4>
83
84 The SilcClientParams includes new fields and some fields have been removed
85 or moved to other places.  All connection timeout related fields have been
86 moved to SilcClientConnectionParams.  The nickname_parse callback pointer has
87 also been removed from SilcClientParams.  The Toolkit 1.1 now automatically
88 parses formatted nicknames.
89
90 <br />&nbsp;<br />
91 The new field boolean `threads' can be used to tell whether the new SilcClient
92 is to use multiple threads or not. If threads support has been compiled in
93 and that field is set to TRUE then the client library will create new thread
94 for each new connection to a remote host.  If you are going to use several
95 connections or some of the connections are high throughput connections (like
96 multimedia connections) then using threads is recommended for performance.
97 Note that your application needs to be multithreaded and, if necessary to,
98 perform concurrencly control in client operation callbacks which may be
99 called from multiple threads at the same time for different connections.
100 However, it is always guaranteed that for one connection the client
101 operations cannot be called from multiple threads.  The multithreads
102 support in Toolkit 1.1 client library means that each new connection and
103 everything related to that connection is handled in own dedicated thread.
104
105 <br />&nbsp;<br />
106 The silc_client_init function now takes several new arguments.  It now takes
107 the username, hostname and realname as argument that used to be required
108 by the application to update directly to SilcClient pointer.  This is not
109 longer required.  Also the nickname is no longer required to be put to
110 SilcClient context as it has been made SilcClientConnection specific.
111 The function also takes a SilcClientRunning callback as argument which will
112 be called when the client library is running.  After that callback the
113 xapplication may start using other client library API functions.
114
115 <br />&nbsp;<br />
116 The silc_client_stop function takes new SilcClientStopped callback as
117 argument, and it will be called after the client library has been completely
118 stopped.  The application should not quit before that is called in order
119 to clean up all resources allocation by the client library.
120
121 <br />&nbsp;<br />
122 It is also not required to put the public key pair (SilcPublicKey and
123 SilcPrivateKey) into SilcClient.  They have been made connection specific so
124 you simply give them as argument when you create new connection.  This way
125 it is now possible to use different key pairs with different connections,
126 one that was not possible in Toolkit 1.0 without creating new SilcClient
127 instance for each new connection.
128
129 <h4>SilcClientConnection</h4>
130
131 The SilcClientConnection represents connection to a remote host.  In new
132 Toolkit 1.1 this structure now includes all connection related data and
133 no connection related data is anymore included in SilcClient.  For this
134 reason it is no longer necessary to create multiple SilcClient instances
135 just because you want to create multiple connections.
136
137 <br />&nbsp;<br />
138 The SilcClientConnectionParams structure has many new fields.  This structure
139 is given as argument to any function that is able to create a new connection
140 or to create a network listener or to create a new SILC sessions.  See the
141 API documentation for all the details but the following one field of special
142 relevance when creating new SILC server connections.  The nickname field is
143 now included in this structure and it is the nickname user would like to
144 initially use in the SILC network.
145
146 <br />&nbsp;<br />
147 The functions silc_client_connect_to_server, silc_client_connect_to_client
148 and silc_client_key_exchange can all be used to create new SILC session with
149 a remote.  To connect SILC server use silc_client_connect_to_server.  You
150 now give the SilcClientCnnectionParams as argument which includes the nickname
151 user wants to use, you now can give the public key pair as argument that is
152 to be used in the connecting.  The new SilcClientConnectCallback will be
153 called once the connection has been established and it delivers the
154 SilcClientConection context to the application.  It will be later called
155 again to indicated disconnection from the remote host.  These functions
156 now return SilcAsyncOperation context which can be used to cancel the
157 connecting, if necessary.  In the past canceling connection was not possible.
158
159 <br />&nbsp;<br />
160 <pre>
161 SilcAsyncOperations op;
162 SilcClientConnectionParams params;
163
164 memset(&params, 0, sizeof(params));
165
166 /* Set nickname user wants to use */
167 params.nickname = nickname;
168
169 /* Set perfect forward secery for key exchange */
170 params.pfs = TRUE;
171
172 /* Example of creating, and then canceling a connection */
173 op = silc_client_connect_to_server(client, params, public_key, private_key,
174                                    remote_host, remote_port, connection_cb,
175                                    app_context);
176 if (!op) {
177   fatal("Connecting failed immediately"));
178   exit(1);
179 }
180
181 ...
182
183 /* Cancel connecting.  After canceling the `connection_cb' will not be
184    called. */
185 silc_async_abort(op);
186 </pre>
187
188 <br />&nbsp;<br />
189 The old function silc_client_start_key_exchange has been replaced with
190 silc_client_key_exchange function.  Semantically it is equivalent to
191 silc_client_connect_to_server but it does not create new connection.  Instead,
192 it accepts SilcStream as argument which is already established connection
193 to a remote host and it merely starts the key exchange.  See an example
194 in the API documentation on how to use the silc_client_key_exchange, if
195 your application wishes itself to create connection instead of using the
196 client library to do it.
197
198 The functions silc_client_add_connection, silc_client_del_connection and
199 silc_client_del_socket has been removed.  They are no longer needed.
200
201 <h4>Entries</h4>
202
203 Just like in Toolkit 1.0 we now have SilcClientEntry to represent user,
204 SilcChannelEntry to represent channel and SilcServerEntry to represent
205 server.  In the past these structures and all API functions that dealt
206 with them were in silcclient.h file.  They are now in silcclient_entry.h
207 in Toolkit 1.1.
208
209 <br />&nbsp;<br />
210 As an general convention each of these new entries now are reference
211 counted and they have locks when using them in multithreaded application.
212 Even in one-threaded application the application must always acquire a
213 reference of the entry if it wishes to save the entry pointer in the
214 application.  The reference must be released once the entry pointer is
215 not needed anymore.  This ensures that the library cannot free the entry
216 pointer underneath the application.  An own API for taking and releasing
217 the reference is in Toolkit 1.1.
218
219 <br />&nbsp;<br />
220 <pre>
221 /* Take reference of the client entry I save to my own context. */
222 my_context->client_entry = silc_client_ref_client(client, conn, client_entry);
223 </pre>
224
225 <br />&nbsp;<br />
226 If multiple threads are used and application wants to access the entry it
227 must always first lock the entry.  After application has read the information
228 it needs from the entry it must release the entry lock.  The entry lock
229 should be held only for short periods of time and failure to release the
230 lock will result into deadlock.   An own API for taking and releasing the
231 entry lock is in Toolkit 1.1.  If you application is not multithreaded
232 you do not need to use the entry locking.
233
234 <br />&nbsp;<br />
235 <pre>
236 /* Read data from client entry in multithreaded environment */
237 silc_client_lock_client(client_entry);
238 fprintf(stdout, "%s\n", client_entry->nickname);
239 fprintf(stdout, "%s\n", silc_id_render(SILC_ID_CLIENT, &client_entry->id));
240 silc_client_unlock_client(client_entry);
241 </pre>
242
243 <br />&nbsp;<br />
244 From the entries all unnecessary information for application has been either
245 removed or moved to internal structure that is not accessible by the
246 application.  As a result the entry structures are much smaller and cleaner.
247
248 <br />&nbsp;<br />
249 The SilcClientEntry now includes nickname_normalized field and it is the
250 normalized version of the user's nickname, in case application needs it.
251 It is also guaranteed in Toolkit 1.1 that the nickname inside SilcCientEntry
252 is always valid nickname.
253
254 <br />&nbsp;<br />
255 The SilcChannelEntry now includes new channel_pubkeys list, which includes
256 the channel public keys if they have added to the channel.  This information
257 was not present in Toolkit 1.0.
258
259 <br />&nbsp;<br />
260 The SilcServerEntry now includes new field public_key, which is the server's
261 public key if we have resolved it.  This information was not present in
262 Toolkit 1.0.
263
264 <br />&nbsp;<br />
265 In Toolkit 1.1 it is now easier to search and resolve entries.  As a new
266 feature it now also possible to search and resolve server entries from the
267 SILC network.  See the API documentation for all the details on searching
268 entries from the client library cache and from the SILC network.
269
270 <h4>Sending/Receiving messages</h4>
271
272 Sending messages has not much changed from the Toolkit 1.1.  In Toolkit 1.1
273 the message may now safely be sent in from multiple threads for same client
274 or for same channel.  In case the message are digitally signed the hash
275 function used in the signature computation must now be given as argument.
276 If this is done in multiple threads, each thread must use different SilcHash
277 context because SilcHash does not support multiple threads.  Simply allocate
278 new SilcHash for each thread where you send digitally signed messages.
279
280 <br />&nbsp;<br />
281 Receiving message is same as in Toolkit 1.0.  You receive private_message
282 or channel_message client operation.  It is always guaranteed that even in
283 multithreaded application the messages are received in one thread.  You need
284 concurrency control in your application only if you access shared data in
285 your client operation callbacks.
286
287 <br />&nbsp;<br />
288 In Toolkit 1.1 as a new feature it is also possible to wait for incoming
289 private messages in a thread.  New function silc_client_private_message_wait
290 can be used to block the calling process or thread until private message
291 for the specified client is received.
292
293 <h4>Calling and sending commands</h4>
294
295 Just like in Toolkit 1.0 in Toolkit 1.1 you can call command implemented
296 inside the client library with silc_client_command_call.  The command_reply
297 client operation will be called once the command reply has arrived.
298
299 <br />&nbsp;<br />
300 As a major change in semantics of sending commands with the
301 silc_client_command_send function is the way the command reply is handled
302 in Toolkit 1.1.  In the new Toolkit the command_reply client operation will
303 not be anymore called for commands that has been sent with
304 silc_client_command_send.  The command_reply client operation is called only
305 when silc_client_command_call function is used.  With silc_client_command_send
306 you can give the command reply callback, SilcClientCommandReply, as argument,
307 and it will be called for each command reply that is received from the
308 server.
309
310 <br />&nbsp;<br />
311 Just likein 1.0 in 1.1 it is also possible to attach to pending commands
312 by using silc_client_command_pending.  As a difference to 1.0 the command
313 identifier is not anymore available to application from the
314 SilcClientConnection context.  Instead the silc_client_command_call and
315 silc_client_command_send return the command identifier, and application needs
316 to save it in order to be able to attach to it at later time.  However,
317 this feature is not expected to be very important for application
318 programmers as the new silc_client_command_send already includes the
319 command reply callback.
320
321 <br />&nbsp;<br />
322 <pre>
323 Comparison between 1.0 and 1.1
324
325 Toolkit 1.0:
326 /* Send ping command.  The reply will be in the attached command reply
327    and in the command_reply client operation. */
328 silc_client_command_send(client, conn, SILC_COMMAND_PING, ++conn->cmd_ident,
329                          1, 1, server_id, server_id_len);
330 silc_client_command_pending(conn, SILC_COMMAND_PING, conn->cmd_ident,
331                             ping_command_reply, context);
332
333 Toolkit 1.1:
334 /* Send ping command.  The reply will be ping_command_reply function. */
335 silc_client_command_send(client, conn, SILC_COMMAND_PING,
336                          ping_command_reply, context,
337                          1, 1, server_id, server_id_len);
338
339 </pre>
340
341 <h4>Notify arguments</h4>
342
343 In Toolkit 1.1 the following notify arguments have had changes.  See
344 the <a href="notifyargs.html">Notify Arguments</a> for details.  You should
345 go through your application and change the handling of the following notify
346 messages for Toolkit 1.1.
347
348 <br />&nbsp;<br />
349 SILC_NOTIFY_TYPE_NICK_CHANGE<br />
350 SILC_NOTIFY_TYPE_CMODE_CHANGE<br />
351 SILC_NOTIFY_TYPE_SERVER_SIGNOFF<br />
352
353 <br />&nbsp;<br />
354 The basic changes in notify arguments from Toolkit 1.0 is that the
355 Toolkit 1.1 parses various lists and other raw data for the application as
356 opposed to sending them in the raw format.  This makes programming easier.
357
358 <h4>Command reply arguments</h4>
359
360 In Toolkit 1.1 the following command reply arguments have had changes.  See
361 the <a href="command_reply_args.html">Command Reply Arguments</a> for
362 details.  You should go through your application and change the handling
363 of the following command replies for Toolkit 1.1.
364
365 <br />&nbsp;<br />
366 SILC_COMMAND_WHOIS<br />
367 SILC_COMMAND_INVITE<br />
368 SILC_COMMAND_STATS<br />
369 SILC_COMMAND_JOIN<br />
370 SILC_COMMAND_CMODE<br />
371 SILC_COMMAND_BAN<br />
372 SILC_COMMAND_DETACH<br />
373 SILC_COMMAND_USERS<br />
374
375 <br />&nbsp;<br />
376 The basic changes in command reply arguments from Toolkit 1.0 is that the
377 Toolkit 1.1 parses various lists and other raw data for the application as
378 opposed to sending them in the raw format..  This makes programming easier.
379
380 <h4>Other changes in client library</h4>
381
382 There are many other smaller changes in Toolkit 1.1 that require you to
383 change your application when porting from Toolkit 1.0.  We are not listing
384 all of them here but briefly mention some API changes.
385
386 <br />&nbsp;<br />
387 Listing channel private keys now return SilcDList instead of an array.
388
389 <br />&nbsp;<br />
390 The key agreement API has changed a little bit and is now more cleaner and
391 supports all the features that are needed in full featured key agreement.
392 The silc_client_peform_key_agreement_fd has been replaced by
393 silc_client_perform_key_agreement_stream.
394
395 <br />&nbsp;<br />
396 The private message key API has slight changes also.  It is no longer
397 necessary for the caller to specify whether the private message key is for
398 responder or initiator use.
399
400 <br />&nbsp;<br />
401 The file transfer API has changed a little bit and is now more cleaner and
402 supports all the features that are needed in full featured file transfer.
403 It is now easier to send files when you are behind NAT when you can
404 specifically define the IPs that are used in both file sending and
405 receiving.
406
407 <br />&nbsp;<br />
408 As a new function silc_client_nickname_format can now be used to format
409 the nickname of a client entry.  The client library automatically formats
410 the nicknames but in some cases application might like to change the
411 nickname of a certain client entry.
412
413
414 <br />&nbsp;<br />
415 <h3><a name="util"></a>Utility library, lib/silcutil/</h3>
416
417 The Utility library (runtime library) has had several changes and has several
418 new interfaces.  Some interfaces has also been removed or moved to some
419 other library.  Removed interfaces rae: silcprotocol.h and silcsockconn.h.
420 Moved interfaces are: silcapputil.h and silcvcard.h.
421
422 <h4>SILC Async Operation Interface</h4>
423
424 A new asynchronous operation API (silcasync.h) has been added.  It can be
425 used to control asynchronous operations, like to cancel them.  Many
426 asynchronous routines in SILC Toolkit now return SilcAsyncOperation context
427 so that the operation can be controlled by the caller.  It especiallly
428 provides a generic way to cancel asynchronous operations which
429 can be difficult.
430
431 <h4>SILC Atomic Operations Interface</h4>
432
433 A new atomic operations API (silcatomic.h) has been added.  It provides
434 routines to perform various operations on integeres and pointers atomically.
435
436 <h4>SILC Data Stack Interface</h4>
437
438 A new data stack (memory pool system) API (silcstack.h) has been added.
439 It provides a fast memory allocation system.  Many routines in the SILC Toolkit
440 are SilcStack aware thus enabling them to use the SilcStack as their source
441 for memory allocation.  All routines that are SilcStack aware automatically
442 revert back to normal memory allocation if SilcStack is not given as
443 argument.  See silcstack.h for list of utility routines that support SilcStack
444 by default.
445
446 <h4>SILC Condition Variable Interface</h4>
447
448 A new condition variable API (silccond.h) has been added.  It provides
449 condition variables for multithreaded applications.
450
451 <h4>SILC Stream Interface</h4>
452
453 A new abstract stream API (silcstream.h) has been added.  The SilcStream
454 provides an abstract way of representing different kinds of streams.  The
455 API provides functions that can be used to read, write, control and destroy
456 streams.  The API is not used to create streams but separate interfaces
457 exist for streams that use the SilcStream abstraction.  For example,
458 socket stream and file descriptor stream exist.
459
460 <h4>SILC FD Stream Interface</h4>
461
462 A new file descriptor stream API (silcfdstream.h) has been added.  It
463 provides a blocking and non-blocking file descriptor stream through the
464 SilcStream abstraction.
465
466 <h4>SILC Socket Stream Interface</h4>
467
468 A new socket stream API (silcsocketstream.h) has been added.  It provides
469 a blocking and non-blocking socket stream through the SilcStream
470 abstraction.
471
472 <h4>SILC FSM Interface</h4>
473
474 A new Finite State Machine API (silcfsm.h) has been added.  It provides
475 an FSM that can be used to implement all kinds of machines and protocols.
476 The machine also supports threads, and threads that are actually executed
477 in real system threads.  The SILC FSM API also supports asynchronous
478 events.
479
480 <h4>SILC Time Interface</h4>
481
482 A new SILC Time API (silctime.h) has been added.  It provides utility
483 functions to retrieve and represent time in different ways.  It supports
484 Universal and Generalized time string creation and parsing and adds a new
485 SilcTime structure to represent time.
486
487 <h4>SILC Snprintf Interface</h4>
488
489 A new snprintf API (silcsnprintf.h) has been added.  It provides snprintf
490 and other string formatting routines.
491
492 <h4>SILC Mutex Interface changes</h4>
493
494 The SILC Mutex API (silcmutex) has several changes.  A support for read/write
495 locks has been added (SilcRwLock).  Also silc_mutex_assert_locked function
496 is added.
497
498 <h4>SILC Network Interface changes</h4>
499
500 The SILC Network API (silcnet.h) has several changes.  The API is almost
501 entirely rewritten and most of the old functions have been removed.  The
502 API has now both TCP and UDP support, and as previously supports IPv4
503 and IPv6.  New functions are silc_net_tcp_create_listener,
504 silc_net_listener_get_port, silc_net_close_listener, silc_net_tcp_connnect,
505 silc_net_udp_connect, silc_net_udp_receive, silc_net_udp_send.
506
507 <h4>SILC Scheduler Interface changes</h4>
508
509 The SILC Schedule API (silcschedule.h) has several changes.  The scheduler
510 has been entirely rewritten but most of the API remains the same.
511 The SILC_TASK_GENERIC and SILC_TASK_CALLBACK_GLOCAL have been removed.
512 The way signal are dispatched has been changed.  The SILC Schedule is now
513 able to itself dispatch all signals.  New functions are
514 silc_schedule_task_add_fd, silc_schedule_task_add_timeout,
515 silc_schedule_task_add_signal, silc_task_del_by_all,
516 silc_schedule_get_fd_events.  The functions silc_schedule_signal_register,
517 silc_schedule_signal_unregister and silc_schedule_signal_call have been
518 removed.
519
520 <h4>SILC Types Interface changes</h4>
521
522 The SILC Type API (silctypes.h) has several changes.  The bool type is
523 replaced with SilcBool.  Sockets are now represented by SilcSocket.
524
525 <h4>SILC String util Interface changes</h4>
526
527 The SILC string utility API (silcstrutil.h) has changes.  The PEM encoding
528 and decoding routines has been renamed, silc_base64_encode,
529 silc_base64_encode_file and silc_base64_decode.  The silc_mime_parse has
530 been removed.  A new silc_string_split function has been added.
531
532 <h4>SILC Utility Interface changes</h4>
533
534
535 <h4>SILC File Util Interface changes</h4>
536
537 The SILC file utility API (silcfileutil.h) has changes.  A new function
538 silc_file_set_nonblock has been added.
539
540 <h4>SILC List and Dynamic List Interface changes</h4>
541
542 The SILC List (silclist.h) and SILC Dynamic List (silcdlist.h) APIs have
543 changes. New functions silc_list_insert and silc_dlist_insert have been
544 added.
545
546 <h4>SILC Buffer Interface changes</h4>
547
548 The SILC Buffer API (silcbuffer.h) has several changes.  The SilcBuffer
549 structure no longer contain the buffer length and true length fields
550 but silc_buffer_len() and silc_buffr_truelen() macros are available
551 instead.  Also silc_buffer_data(), silc_buffer_datalen(), silc_buffer_purge(),
552 silc_buffer_reset(), silc_buffer_start(), silc_buffer_end() and
553 silc_buffer_enlarge() has been added.  The API also supports SilcStack.
554
555 <h4>SILC Buffer Formatting Interface changes</h4>
556
557 The SILC Buffer Formatting API (silcbuffmt.h) has several changes.  The
558 silc_buffer_format now automatically allocates memory to the destination
559 buffer if it does not have space.  Also new the following new formatters
560 have been added: SILC_STR_DATA (replaces SILC_STR_UI_XNSTRING),
561 SILC_STR_BUFFER, SILC_STR_FUNC, SILC_STF_OFFSET and SILC_STR_ADVANCE.
562 The API also supports SilcStack.
563
564 <h4>SILC Memory Interface changes</h4>
565
566 The memory allocation API (silcmemory.h) has several changes.  It supports
567 now SilcStack as memory source.  Also all memory allocation routines can
568 now fail and return NULL as opposed to fatally failing when memory allocation
569 fails.
570
571 <br />&nbsp;<br />
572 <h3><a name="apputil"></a>SILC Application Utility library, lib/silcapputil/</h3>
573
574 A new SILC Application Utility library has been added.  It provides
575 various application specific utility libraries that are not part of
576 the runtime library (lib/silcutil/).  The interfaces in the Application
577 utility library were in other libraries in Toolkit 1.0 and the library
578 does not contain any entirely new interfaces.
579
580 <h4>SILC Application Utility Interface</h4>
581
582 The silcapputil.h contains various application utility functions.  It
583 existed in Toolkit 1.0 but some of the APIs has been changed.  The
584 silc_create_key_pair, silc_load_key_pair and silc_show_public_key APIs
585 has changed.  A new silc_show_public_key_file has been added.  Functions
586 silc_identifier_check, silc_identifier_verify, silc_channel_name_check,
587 silc_channel_name_verify, silc_get_mode_list silc_get_status_message,
588 silc_get_packet_name, silc_get_command_name, silc_parse_version_string,
589 silc_version_to_num, silc_client_chmode, silc_client_chumode,
590 silc_client_chumode_char and silc_id_render has been moved from other
591 libraries into this interface in Toolkit 1.1.
592
593 <h4>SILC ID Cache Interface</h4>
594
595 The ID Cache interface (silcidcache.h) has been moved from lib/silccore
596 into lib/silcapputil/.
597
598 <br />&nbsp;<br />
599 <h3><a name="skr"></a>SILC Key Repository library, lib/silcskr/</h3>
600
601 A new SILC Key Repository library has been added.  The library provides
602 a SILC Key Repository API (silcskr.h) which provides a repository for
603 storing and retrieving public keys.
604
605 <br />&nbsp;<br />
606 <h3><a name="vcard"></a>SILC VCard library, lib/silcvcard/</h3>
607
608 A new SILC VCard library has been added.  The SILC VCard API has been
609 moved from utility library to own library in lib/silcvcard/.
610
611 <br />&nbsp;<br />
612 <h3><a name="http"></a>SILC HTTP library, lib/silchttp/</h3>
613
614 A new SILC HTTP library has been added.  The library includes SILC HTTP
615 Server Interface and SILC HTTP PHP Translator Interface.
616
617 <h4>SILC HTTP Server Interface</h4>
618
619 The SILC HTTP Server API (silchttpservder.h) provides a simple HTTP
620 server implementation for applications that want to integrate a small
621 HTTP server.
622
623 <h4>SILC HTTP PHP Translator Interface</h4>
624
625 The SILC HTTP PHP Translator API (silchttpphp.h) provides PHP translates
626 PHP code into HTML.  It can be used to serve PHP pages in HTTP server.
627
628 <br />&nbsp;<br />
629 <h3><a name="asn1"></a>SILC ASN.1 library, lib/silcasn1/</h3>
630
631 A new Abstract Syntax Notation One (ASN.1) library has been added.  The
632 library provides SILC ASN.1 encoder and decoder interface and SILC BER
633 encoder and decoder interface.
634
635 <h4>SILC ASN.1 Interface</h4>
636
637 The SILC ASN.1 API (silcasn1.h) provides ASN.1 encoder and decoder.  The
638 interface provides efficient encoder and decoder and is support SilcStack
639 as memory source.  The interface is simple and it supports almost all ASN.1
640 features.
641
642 <h4>SILC BER Interface</h4>
643
644 The SILC BER API (silcber.h) provides BER/DER encoder and decoder.  It is
645 integral part of the ASN.1 library and the ASN.1 encoder and decoder.