Created several new files.
authorPekka Riikonen <priikone@silcnet.org>
Tue, 27 Jun 2000 19:40:00 +0000 (19:40 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Tue, 27 Jun 2000 19:40:00 +0000 (19:40 +0000)
Updates homepages for release.

public_html/about.html
public_html/copying.html
public_html/docs.html [new file with mode: 0644]
public_html/docs/CodingStyle [new file with mode: 0644]
public_html/docs/draft-riikonen-silc-ke-auth-00.txt [new file with mode: 0644]
public_html/docs/draft-riikonen-silc-pp-00.txt [new file with mode: 0644]
public_html/docs/draft-riikonen-silc-spec-00.txt [new file with mode: 0644]
public_html/features.html
public_html/history.html
public_html/index.html
public_html/todo.html [new file with mode: 0644]

index 2d6ee33ab95035c6cfdcf2031c14d02a59d9da4b..cdf64b29bda7542d28361ca1b5962f5fc278680f 100644 (file)
@@ -1,4 +1,5 @@
 <html>
 <html>
+<style TYPE="text/css"><!-- A:link {text-decoration: none}A:visited{text-decoration:none}A:active{text-decoration:none}--></style>
 <body bgcolor="#ffffff">
 <p><br>
 <a href="index.html"><img src="silc2.jpg" border=0></a>
 <body bgcolor="#ffffff">
 <p><br>
 <a href="index.html"><img src="silc2.jpg" border=0></a>
@@ -19,6 +20,18 @@ than that they are nothing alike.  Biggest differences are that SILC is
 secure what IRC is not in any way.  The network model is also entirely
 different compared to IRC.
 
 secure what IRC is not in any way.  The network model is also entirely
 different compared to IRC.
 
+<p>
+SILC is an open source (or freeware) project and it has been released
+under the GNU General Public Licence.  The SILC is free to use and everyone
+is free to distribute and change the SILC under the terms of the GNU GPL.
+While there is no guarantee for the product SILC has been tried make
+as secure as possible.  The fact that the software and the protocol is
+open for public analysis is a good thing for end user.
+<p>
+Protocol specification of SILC protocol is available for
+anyone to look at. There exists three Internet Drafts that has been
+submitted to <a href="http://www.ietf.org">IETF</a>. 
+See <a href="docs.html">documentation page</a> for more information.
 <p>
 <h1>Contact</h1>
 <p>
 <p>
 <h1>Contact</h1>
 <p>
@@ -37,5 +50,4 @@ priikone@poseidon.pspt.fi
 </tr>
 </table>
 </body>
 </tr>
 </table>
 </body>
-</html>
-
+</html>
\ No newline at end of file
index 1fc18fedc855c2557b8dfe87672e231da33f6aaa..9838065199e29797dcb00236af794789c2c0acb6 100644 (file)
@@ -1,4 +1,5 @@
 <html>
 <html>
+<style TYPE="text/css"><!-- A:link {text-decoration: none}A:visited{text-decoration:none}A:active{text-decoration:none}--></style>
 <body bgcolor="#ffffff">
 <p><br>
 <a href="index.html"><img src="silc2.jpg" border=0></a>
 <body bgcolor="#ffffff">
 <p><br>
 <a href="index.html"><img src="silc2.jpg" border=0></a>
diff --git a/public_html/docs.html b/public_html/docs.html
new file mode 100644 (file)
index 0000000..d5038ad
--- /dev/null
@@ -0,0 +1,92 @@
+<html>
+<style TYPE="text/css"><!-- A:link {text-decoration: none}A:visited{text-decoration:none}A:active{text-decoration:none}--></style>
+<body bgcolor="#ffffff">
+<p><br>
+<a href="index.html"><img src="silc2.jpg" border=0></a>
+<table width="70%" border="0" cellspacing="0" cellpadding="1"
+align=center>
+<tr>
+<td>
+<p>
+<font size=4>
+<h1>SILC Documentation</h1>
+<p>
+Currently the SILC documentation is under work and the software does not
+have that much of a documentation.
+<p>
+[Coming later: Software manual, SILC Library Reference manual]
+
+<p><br>
+<h1>Other Documentation</h1>
+<p>
+Coding Style in SILC source tree: <a href="docs/CodingStyle">CodingStyle</a>
+
+<p><br>
+<h1>SILC Protocol Internet Drafts</h1>
+<p>
+SILC Protocol is documented and three Internet Drafts exists. These 
+Internet Drafts has been submitted, also, to the
+<a href="http://www.ietf.org">IETF</a>.
+<p>
+<li>Secure Internet Live Conferencing (SILC), Protocol Specification
+<p>
+Abstract
+<p>
+This memo describes a Secure Internet Live Conferencing (SILC)
+protocol which provides secure conferencing services over insecure
+network channel.  SILC is IRC [IRC] like protocol, however, it is 
+not equivalent to IRC and does not support IRC.  Strong cryptographic
+methods are used to protect SILC packets inside SILC network.  Two
+other Internet Drafts relates very closely to this memo;  SILC Packet
+Protocol [SILC2] and SILC Key Exchange and Authentication Protocols
+[SILC3].
+<p>
+<a href="docs/draft-riikonen-silc-spec-00.txt">
+draft-riikonen-silc-spec-00.txt</a>
+<p><br>
+
+<li>SILC Packet Protocol
+<p>
+Abstract
+<p>
+This memo describes a Packet Protocol used in the Secure Internet Live
+Conferencing (SILC) protocol specified in the Secure Internet Live
+Conferencing, Protocol Specification Internet Draft [SILC1].  This
+protocol describes the packet types and packet payloads which defines
+the contents of the packets.  The protocol provides secure binary packet
+protocol that assures that the contents of the packets are secured and
+authenticated.
+<p>
+<a href="docs/draft-riikonen-silc-pp-00.txt">
+draft-riikonen-silc-pp-00.txt</a>
+<p><br>
+
+<li>SILC Key Exchange and Authentication Protocols
+<p>
+Abstract
+<p>
+This memo describes two protocols used in the Secure Internet Live
+Conferencing (SILC) protocol specified in the Secure Internet Live
+Conferencing, Protocol Specification internet-draft [SILC1].  The
+SILC Key Exchange (SKE) protocol provides secure key exchange between
+two parties resulting into shared secret key material.  The protocol
+is based on Diffie Hellman key exchange algorithm and its functionality
+is derived from several key exchange protocols.  SKE uses best parts
+of the SSH2 Key Exchange protocol, Station-To-Station (STS) protocol
+and the OAKLEY Key Determination protocol [OAKLEY].
+<p>
+The SILC Connection Authentication protocol provides user level
+authentication used when creating connections in SILC network.  The
+protocol is transparent to the authentication data which means that it
+can be used to authenticate the user with, for example, passphrase
+(pre-shared- secret) or public key (and certificate).
+<p>
+<a href="docs/draft-riikonen-silc-ke-auth-00.txt">
+draft-riikonen-silc-ke-auth-00.txt</a>
+<p><br>
+
+</td>
+</tr>
+</table>
+</body>
+</html>
\ No newline at end of file
diff --git a/public_html/docs/CodingStyle b/public_html/docs/CodingStyle
new file mode 100644 (file)
index 0000000..e603353
--- /dev/null
@@ -0,0 +1,575 @@
+Coding Style in SILC source tree
+================================
+
+This documents describes the coding style and coding conventions used
+in the SILC source tree.  The purpose of the document is to describe the
+common way to program for SILC and thus should be learned when programming
+new code.  The document describes various conventions regarding variable
+naming, function naming, indentation, overall appearance of a piece of
+code and how some of the technical issues has been done in the SILC and
+should be done in the future.
+
+
+Naming
+======
+
+Generic naming
+
+All identifiers, whether they defines, functions or something else, with
+execption of variables, has a common naming convention.  Usually all 
+identifiers use `silc' prefix to indicate that the identifier is part of
+SILC distribution.  For example, silc_server_init(), SILC_PACKET_TYPE_ERROR, 
+etc.  As mentioned however, variables, local or global, does not use this
+naming convention.
+
+Lower lever routines, usually some library routines, may use their
+own naming convention if generic API is defined over them.  The API uses
+the common naming convention while the lower level routines uses what
+ever they want.  For example, ciphers are implemented currently in this
+way.  They define common SILC Cipher API but the actual implementation
+of algorithms uses their own naming convention.  Another example is
+the GMP math library that uses its own function naming but we have our
+own SILC MP API over it that has been defined using common SILC naming
+convention.
+
+
+Variables
+
+Variable names are always in lowercase and any mixed-case or totally
+uppercase variable names should be avoided.  Variable names may include
+underscore if it is necessary.  For example, `unsigned char *id_string;'.
+
+The same name convention is used in structure field names.  All fields
+in structures should be in lowercase.  Global variables should have some
+sort of prefix to indicate that the variable is global.  Although, global
+variables should be avoided if possible.
+
+Local variable names should be as short as possible without losing
+meaning of the name.  For example there is no reason to call loop
+counter as `loop_counter' when `i' is commonly used instead.  Using
+variable name `tmp' is also ok and should be used when some temporary
+value is used.
+
+
+#define's and Macros
+
+All #define's should always be in uppercase to indicate that it is
+a define, for example, `#define SILC_PACKET_TYPE_NONE 0'.  As mentioned
+previously #define's and macros always use the `SILC' prefix.  The
+names also uses always underscores.
+
+Names of #define's and macros should be self explanatory.  This may
+lead to long names but it is better than having some `#define SILC_KE1_SX'
+which does not tell you anything.
+
+
+Type definitions
+
+Type definitions (typedefs) uses some what different naming convention
+from variables and macros.  Typedefs has mixed-case names and they
+never use underscores.  For example, `SilcSomeStruct', `SilcServerObject'.
+Like in any other case the names should be self explanatory which may
+lead to long names but that is not a problem.
+
+The names should tell what the typedef is about.  If it is a typedef
+of a structure it should tell what the structure is for in the first
+place.  For example `SilcClientStruct', `SilcCipherObject', 
+`SilcConfigSection´, etc.
+
+
+Structures
+
+Same naming convention used in typedefs applies to names of structures as
+well.  Same as with typedef, structure names should be self explanatory
+and should tell what the structure is made for.
+
+Structures are used a lot in SILC.  They are used as simple structures
+and as objects as well.  When normal structures are needed they are
+defined as follows,
+
+       struct SilcDummyStruct {
+         unsigned char *dummy;
+       };
+
+And used as `struct SilcDummyStruct *dummy'.  However, this is quite
+rarely used in the SILC, instead structures are typedef'd as following
+later.  When structure is used as object they are defined as follows,
+
+       typedef struct SilcDummyStruct {
+         unsigned char *dummy;
+         unsigned int flags;
+         void (*callback)(void *, unsigned int);
+       } SilcDummyObject;
+
+If the SilcDummyStruct is not needed it may be omitted (which is very
+common in SILC code), leaving,
+
+       typedef struct {
+         unsigned char *dummy;
+         unsigned int flags;
+         void (*callback)(void *, unsigned int);
+       } SilcDummyObject;
+
+Finally, it is common that structures are typedef'd pointers as they
+are very flexible to use,
+
+       typedef SilcDummyObject *SilcDummy;
+
+It is common in SILC to typedef structures instead of defining name
+for the structure.  In this case the structure may be used without
+defining `struct' to the code, For example,
+
+       SilcDummyObject dummy_obj;
+       SilcDummyObject *dummy;
+
+If the structure has a pointer typedef then they are defined as normal
+variables but for real they are pointers, For example,
+
+       SilcDummy dummy;
+       dummy = silc_calloc(1, sizeof(*dummy));
+       dummy->flags = 0;
+
+This convention is very common in SILC code and has been used consistently
+throughout the code.  The pattern here is that all structures are named
+as `SilcXxxStruct', all objects are named as `SilcXxxObject' and when
+they are typedef'd pointers they are named as `SilcXxx'.
+
+
+Functions
+
+Function naming uses the common naming convention used in the SILC.  All
+functions are always lowercase and they use underscores.  The name of
+the function always starts with prefix `silc_'.  The name of the function
+should be self explanatory which may lead to long names.  The name of
+a function is constructed from following parts,
+
+       silc_<application>_<module>_<function>
+
+The <application> is for example <client> or <server>, however, it is
+always omitted (and must be omitted) when programming library code.
+
+The <module> is the module you are programming currently.  You should
+have a pretty good idea what you are programming and what the module
+does.  For example, <cipher>, <config>, <command>, <packet>, etc.
+
+The <function> is the describtion of the functionality of the function
+you are writing.  Naturally it should be self explanatory and weird
+short names should be avoided.  It is better to have long function
+names than some odd name that does not tell what it is about.  Function
+naming could be for example, <read>, <new_id>, <register>, <find_by_name>,
+etc.
+
+So, it is common in SILC to have function names, such as,
+
+       silc_server_packet_send
+       silc_server_packet_send_to_channel
+       silc_client_packet_process
+       silc_idcache_del_by_id
+       silc_task_unregister_by_fd
+       silc_protocol_excute_final
+       silc_buffer_alloc
+
+When function registers something the name of the function should
+generally be `silc_function_register' and unregistering should happen
+with `silc_function_unregister'.  When function allocates something it
+should be called `silc_function_alloc' and when freeing it should be
+called `silc_function_free'.  Respectively, with init/uninit functions.
+
+When this naming convention is used consistently it is easy to remember
+what the name of the function is.  For example, if you need buffer it
+is easy to figure out that the routines are most likely called 
+`silc_buffer_*',  and if you need to allocate buffer it is most likely 
+called `silc_buffer_alloc'.  This sort of naming makes the programming,
+in the long run, much cleaner, simpler and faster.
+
+
+Inline functions
+
+SILC uses quite a bit inline functions to optimize the code.  The
+naming of inline functions must follow same convention as any normal
+function.  All inline functions in SILC are defined and written into
+header files.  Inline functions must be defined in following manner
+in the header file,
+
+extern inline void silc_dummy_inline(unsigned int flags)
+{
+  doing_little_dummy_things;
+}
+
+Because the function is defined as extern they can be included into
+public header files.  Do not forget to define inline function as extern.
+There are no any explicit prototype definitions for inline functions.
+
+
+Indentation
+===========
+
+SILC has been coded with Emacs so standard indentation of Emacs is used
+in the SILC code.  The indentation is always 2 characters, not a 
+tabulator.  If you use Emacs then this should not be a problem.  So,
+if you code for SILC be sure to format the code to the standard way
+used in the SILC before submitting the code.
+
+A tip for those who think that these long function names etc are just
+too long to type, consider using dynamic abbreviation found in Emacs.
+With this cool feature you only have type some part of the string and
+then use the dabbrev to find the rest of the string.  I guess, by 
+default it is M-/ in Emacs but I have binded it into Shift-TAB so it
+is fast to use when typing.
+
+
+Placing Braces
+==============
+
+The common fight about how the braces should be placed in the C code
+is probably going on in the SILC code as well.  However, SILC code
+is consistent about this.  The placing uses K&R style thus the opening
+of the brace is put to the last on the line and the closing brace is
+on first on its own line,
+
+       if (condition) {
+         silc_something();
+         silc_something_more();
+       }
+
+The function's braces are as follows,
+
+       int silc_client_function()
+       {
+         return 0;
+       }
+
+More examples,
+
+       if (condition) {
+         something;
+         silc_something_more();
+       } else {
+         something_else;
+       }
+
+       if (condition) {
+         something;
+         silc_something_more();
+       } else if (other_condition) {
+         something;
+         silc_something_more();
+       } else {
+         something_else;
+       }
+
+
+Commenting
+==========
+
+SILC code is usually pretty well commented and this should be the way
+in the future as well.  However, the comments should not tell how the
+code works, it should be apparent by looking at the code.  Instead the
+commenting should tell what the function does.  All functions should
+be commented.  If nothing more a line of comment telling what the function
+is about helps a lot when you go back to it after six months.  Static
+functions should be commented as well.
+
+The commenting of functions in SILC has been made into the source files,
+and not in the header files where the function prototypes reside.  Header
+files usually includes structure comments, macro comments and perhaps
+some other relevant commenting but usually not function comments.
+It is also Ok to comment the code inside function when it is needed.
+
+Comments should use normal C-language comments /* */ and not C++ comments.
+
+
+General Appearance
+==================
+
+The code should be clean and good to eye, although the function of it
+must always supersede the appearance.  However, it is nice to read code
+that looks good.  Here are some issues on general appearance.
+
+       o Use empty lines when appropriate but not too much.  There
+         should not be excess empty lines at the end of file.  However,
+          using some empty lines in the code makes the code better 
+          looking.
+
+       o The line is 79 characters long and not one character longer.
+         Longer lines must be cut in two, or three, or ...
+
+       o Use spaces very much.  Do not write things like `if(!k)',
+         instead write `if (!k)'.  Same with `for', `while', etc.
+         Spaces should be put around all binary operators like `*', 
+         `==', `+', etc.  Also, when setting a value to variable be
+         sure to set spaces around `='.  When writing argument list 
+         to a function, space should follow each of the comma in the
+         list.  However, do not use spaces with parenthesis, for 
+         example, `if ( !k )' is not accepted.
+
+       o If you are not sure about how something should be done or
+         the code you've done is not finished, it should be commented
+         with XXX plus explanation what is going on.
+
+
+Source Files
+
+All source files starts with header that includes the name of the author,
+copyright notice and the copyright policy, usually part of GNU GPL licence.
+Now, this really isn't that important but some sort of header should be in
+all source files.
+
+In the start of the source files should include the #include's that are
+needed.  All library source files must include `silcincludes.h', this is
+a must.  Client source file must include at least `clientincludes.h' and
+server source file must include `serverincludes.h'.  Additional include's
+may be added as well, however, system specific includes should not be
+added directly (unless it is really a special case).  Go see any source
+file as an example.
+
+
+Header Files
+
+As with source files, header files should include same file header at
+the start of the file.
+
+Header files are usually divided in three parts in SILC.  At the start
+of header files should include all definitions, typedefs, structure
+definitions etc.  After definitions should include macros and inline
+functions if any of those exist.  After macros should include the
+public prototypes of the functions.  Go see any header file as an example.
+
+
+Debug Messages
+==============
+
+When writing new code it is recommended that the code produces some sort
+of debug messages.  SILC has own debug logging system that must be used
+in the generic SILC code.  Few macros exist,
+
+       SILC_LOG_DEBUG
+       SILC_LOG_HEXDUMP
+       SILC_LOG_INFO
+       SILC_LOG_WARNING
+       SILC_LOG_ERROR
+       SILC_LOG_FATAL
+
+When doing debugging the most used macros are SILC_LOG_DEBUG and 
+SILC_LOG_HEXDUMP.  With first macro you can print out any sort of debug
+messages with variable argument list, for example,
+
+       SILC_LOG_DEBUG(("Start"));
+       SILC_LOG_DEBUG(("Packet length %d", packet_len));
+
+Note the extra parenthesis that are required for the macro so that the
+variable argument list formatting would work correctly.
+
+When you need to dump some data into screen you should use SILC_LOG_HEXDUMP
+macro.  For example,
+
+       SILC_LOG_HEXDUMP(("Packet"), packet->data, packet->len);
+       SILC_LOG_HEXDUMP(("Packet, size %d", size), packet->data, packet->len);
+
+In SILC_LOG_HEXDUMP the data to be dumped are set between the second last
+and last parenthesis in order that the data is first and the length of the
+data is next.  If arguments are used they are used the same way as in
+SILC_LOG_DEBUG and the data to be dumped are set after the argument list
+is closed with the parenthesis.
+
+
+Memory Allocation
+=================
+
+Naturally, memory allocation is a big part of SILC.  However, there are
+few things that must be noted on the issue.  SILC has defined its own
+memory allocation functions that must be used.  System specific functions
+must not be used directly.  There are functions like,
+
+       silc_malloc
+       silc_calloc
+       silc_realloc
+       silc_free
+
+You should always use silc_calloc instead of silc_malloc because
+silc_calloc automatically zeroes the allocated memory area.  This is
+important especially with structures because generally we want that all
+fields, by default, are zero.
+
+So, instead of doing
+
+       SilcStruct *ptr;
+
+       ptr = silc_malloc(sizeof(*ptr));
+
+You should do
+
+       SilcStruct *ptr
+
+       ptr = silc_calloc(1, sizeof(*ptr));
+
+
+When freeing memory it should be zero'ed when appropriate.  All memory
+allocations that handle sensitive data such as keys should be zero'ed
+by memset() before freeing the memory.  Common way to do is,
+
+       memset(ptr, 'F', sizeof(*ptr));
+       silc_free(ptr);
+
+Where 'F' indicates free'd memory if you ever check it with debugger.
+Other choice is to use 0 instead of 'F'.  The pointer after freeing 
+should be set to NULL if appropriate, ptr = NULL.
+
+Note that some functions in the SILC library handles the zeroing of
+the memory area automatically, like for example, silc_buffer_free.
+
+
+Callback Programming
+====================
+
+SILC uses pretty much programming convention called callback programming.
+This is a programming style that extensively uses function pointers
+which are usually called inside some other function.
+
+Typical scenario is this;  You are performing some task that most likely
+is asynchronous.  You need to be able get some structure context when
+the operation finishes.  Most common way in this case is to pass the
+structure context to the operation function with a callback function
+that is called when the operation has finished.  Following code explains
+probaly better.
+
+
+/* Prototypes */
+static silc_callback(void *context);
+void silc_start();
+void silc_async_operation_register(int fd, SilcAsyncCb callback, 
+                                   void *context);
+void silc_async_operation(int fd, SilcAsyncCb callback, void *context);
+
+/* Type definition of the callback function */
+typedef (*SilcAsyncCb)(void *context);
+
+/* Registers async operation and passes callback function and context
+   to it as arguments. */
+
+void silc_start()
+{
+  SilcDummyStruct *ctx;
+
+  ctx = silc_calloc(1, sizeof(*ctx));
+  ctx->fd = 30;
+
+  silc_async_operation_register(30, silc_callback, (void *)ctx);
+}
+
+/* The callblack function that is called from the operation function */
+
+static void silc_callback(void *context)
+{
+  SilcDummyStruct *ctx = (SilcDummyStruct *)context;
+
+  ctx->fd = 10;
+}
+
+/* Register async operation */
+
+void silc_async_operation_register(int fd, SilcAsyncCb callback, 
+                                   void *context)
+{
+  /* Register and return immediately */
+  silc_register_async_operation_internal(fd, callback, context);
+}
+
+/* Operation function that will call the callback function after it
+   has finished. */
+
+void silc_async_operation(int fd, SilcAsyncCb callback, void *context)
+{
+  here_this_function_does_what_ever_it_wants;
+
+  here_something_more;
+
+  /* We are finished, call the callback */
+  if (callback)
+    (*callback)(context);
+}
+       
+
+Now, after the registeration of the async operation in this dumb example
+the silc_start returns immediately.  Lets say, 10 seconds later the
+async operation is executed (it would have been better to call it just
+timeout) by calling silc_async_operation which on the other hand will
+call the callback function after it has finished.  The context that
+was passed to the registeration function is now passed back to the
+callback function.  Thus, you will get the context you wanted.  This is
+the typical scenario where callback functions come in very handy.  This 
+is also the best way to pass context's that are needed later without
+making them global context's.  And as long as the context's are defined
+as void * they can be what ever contexts making the functions, that
+takes in the context, generic.  Like in above example, you could pass
+what ever context to the registeration function if you'd want to.
+
+Callback programming is also used when making generic API's of some
+operation.  For example, if you want generic hooks to the API so that
+something could be done while doing the operation (maybe to collect
+statistics or something else) just get the functions accept a callback
+function and context and call them when appropriate, then continue
+as normally.
+
+Callback functions has been used a lot in SILC code.  The scheduler
+and task system implemented in core library uses extensively callback
+functions.  Timeout's uses callbacks as well.  SILC Key Exchange protocol
+uses callback functions too.  The callback function in SKE provides
+packet sending without defining into the SKE code how the packets
+should be sent thus making it generic for both client and server 
+(and actually to any application for that matter).
+
+There are some technical issues on callback programming that are
+common in SILC code.
+
+       o Callback functions are usually defined as void functions
+         as the routine that calls them usually don't care about
+         what the callback function does.  Many times it doesn't
+         actually know what it does nor would it be interested to
+         know that.  It doesn't care about return values.
+
+       o Many times the callback functions are static functions
+         because they are not wanted to be called in anyway else
+         than as callback functions.
+
+       o Callback function names usually have the `_cb' or `_callback'
+         at the end of function name, eg. silc_client_cb.
+
+       o Type of callback functions should be typedef'd instead of
+         defining them directly to the function.  See above example.
+         This makes the code much cleaner.
+
+       o Callback function types has usually the suffix `Cb' or
+         ´Callback' in the type name, eg. SilcAsyncCallback.
+
+       o You must explicitly cast the void * context's to correct
+         type in the callback function.  Of course you must be careful
+         to cast them to the correct type as they are void * they 
+         could be anything.  Many times this causes problems when you
+         forget what was the type you passed to it.  Callback 
+         programming may get very complex.
+
+       o You cannot use inline functions as callback functions,
+         naturally.
+
+Callback programming may be hard to understand from first standing if
+you haven't done these before, and debugging them may be pain in the
+ass sometimes.  But after the grand idea behind callback functions 
+becomes clear they are a wonderful tool.
+
+
+Copyrights of the Code
+======================
+
+The original code in SILC is GPL licensed.  GMP is GPL licensed as well
+and zlib is with free license as well.  New code will be accepted to
+the official SILC source tree if it is coded in GPL or similiar free
+license as GPL is, and of course if it is public domain.  Code with
+restricting licenses will not be accepted to the SILC source tree.
+SILC is free software, open source, what ever, project and will remain
+as such.
+
+Also, about authoring; If you write code to SILC don't forget to add
+yourself as author at the start of the file.  The reason for this is
+of course that everybody should get the credits they deserve but also 
+if problems occur we know who to blame. :)
diff --git a/public_html/docs/draft-riikonen-silc-ke-auth-00.txt b/public_html/docs/draft-riikonen-silc-ke-auth-00.txt
new file mode 100644 (file)
index 0000000..d180a98
--- /dev/null
@@ -0,0 +1,1123 @@
+
+
+
+
+
+
+Network Working Group                                      P. Riikonen
+Internet-Draft
+draft-riikonen-silc-ke-auth-00.txt                        28 June 2000
+Expires: 28 Jan 2001
+
+
+              SILC Key Exchange and Authentication Protocols
+
+Status of this Memo
+
+   This document is an Internet-Draft.  Internet-Drafts are working
+   documents of the Internet Engineering Task Force (IETF), its areas,
+   and its working groups.  Note that other groups may also distribute
+   working documents as Internet-Drafts.
+
+   Internet-Drafts are draft documents valid for a maximum of six
+   months and may be updated, replaced, or obsoleted by other
+   documents at any time. It is inappropriate to use Internet-Drafts
+   as reference material or to cite them other than as
+   ``work in progress.''
+
+   To learn the current status of any Internet-Draft, please check the
+   ``1id-abstracts.txt'' listing contained in the Internet-Drafts
+   Shadow Directories on ftp.is.co.za (Africa), nic.nordu.net (Europe),
+   munnari.oz.au (Pacific Rim), ds.internic.net (US East Coast), or
+   ftp.isi.edu (US West Coast).
+
+   The distribution of this memo is unlimited.
+
+
+Abstract
+
+   This memo describes two protocols used in the Secure Internet Live
+   Conferencing (SILC) protocol specified in the Secure Internet Live
+   Conferencing, Protocol Specification internet-draft [SILC1].  The
+   SILC Key Exchange (SKE) protocol provides secure key exchange between
+   two parties resulting into shared secret key material.  The protocol
+   is based on Diffie Hellman key exchange algorithm and its functionality
+   is derived from several key exchange protocols.  SKE uses best parts
+   of the SSH2 Key Exchange protocol, Station-To-Station (STS) protocol
+   and the OAKLEY Key Determination protocol [OAKLEY].
+
+   The SILC Connection Authentication protocol provides user level
+   authentication used when creating connections in SILC network.  The
+   protocol is transparent to the authentication data which means that it
+   can be used to authenticate the user with, for example, passphrase
+   (pre-shared- secret) or public key (and certificate).
+
+
+
+
+Riikonen                                                        [Page 1]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+Table of Contents
+
+   1 Introduction ..................................................  2
+   2 SILC Key Exchange Protocol ....................................  3
+     2.1 Key Exchange Payloads .....................................  3
+         2.1.1 Key Exchange Start Payload ..........................  4
+         2.1.2 Key Exchange 1 Payload ..............................  7
+         2.1.3 Key Exchange 2 Payload ..............................  9
+     2.2 Key Exchange Procedure .................................... 10
+     2.3 Processing the Key Material ............................... 12
+     2.4 SILC Key Exchange Groups .................................. 13
+         2.4.1 diffie-hellman-group1 ............................... 13
+         2.4.2 diffie-hellman-group2 ............................... 14
+     2.5 Key Exchange Status Types ................................. 14
+   3 SILC Connection Authentication Protocol ....................... 16
+     3.1 Connection Auth Payload ................................... 17
+     3.2 Connection Authentication Types ........................... 18
+         3.2.1 Passphrase Authentication ........................... 18
+         3.2.2 Public Key Authentication ........................... 18
+     3.3 Connection Authentication Status Types .................... 19
+   4 Security Considerations ....................................... 19
+   5 References .................................................... 19
+   6 Author's Address .............................................. 20
+
+
+List of Figures
+
+   Figure 1:  Key Exchange Start Payload
+   Figure 2:  Key Exchange 1 Payload
+   Figure 3:  Key Exchange 2 Payload
+   Figure 4:  Connection Auth Payload
+
+
+1 Introduction
+
+   This memo describes two protocols used in the Secure Internet Live
+   Conferencing (SILC) protocol specified in the Secure Internet Live
+   Conferencing, Protocol Specification internet-draft [SILC1].  The
+   SILC Key Exchange (SKE) protocol provides secure key exchange between
+   two parties resulting into shared secret key material.  The protocol
+   is based on Diffie Hellman key exchange algorithm and its functionality
+   is derived from several key exchange protocols.  SKE uses best parts
+   of the SSH2 Key Exchange protocol, Station-To-Station (STS) protocol
+   and the OAKLEY Key Determination protocol.
+
+   The SILC Connection Authentication protocol provides user level
+   authentication used when creating connections in SILC network.  The
+   protocol is transparent to the authentication data which means that it
+
+
+
+Riikonen                                                        [Page 2]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+   can be used to authenticate the user with, for example, passphrase
+   (pre-shared- secret) or public key (and certificate).
+
+   The basis of secure SILC session requires strong and secure key exchange
+   protocol and authentication.  The authentication protocol is entirely
+   secured and no authentication data is ever sent in the network without
+   encrypting and authenticating it first.  Thus, authentication protocol
+   may be used only after the key exchange protocol has been successfully
+   completed.
+
+   This document refers constantly to other SILC protocol specification
+   Internet Drafts that are a must read for those who wants to understand
+   the function of these protocols.  The most important references are
+   the Secure Internet Live Conferencing, Protocol Specification [SILC1]
+   and SILC Packet Protocol [SILC2] Internet Drafts.
+
+   The protocol is intended to be used with the SILC protocol thus it
+   does not define own framework that could be used.  The framework is
+   provided by the SILC protocol.
+
+
+2 SILC Key Exchange Protocol
+
+   SILC Key Exchange Protocol (SKE) is used to exchange shared secret
+   between connecting entities.  The result of this protocol is a key
+   material used to secure the communication channel.  The protocol uses
+   Diffie-Hellman key exchange algorithm and its functionality is derived
+   from several key exchange protocols.  SKE uses best parts of the SSH2
+   Key Exchange protocol, Station-To-Station (STS) protocol and the OAKLEY
+   Key Determination protocol.  The protocol does not claim any conformance
+   to any of these protocols, they were merely used as a reference when
+   designing this protocol.
+
+   The purpose of SILC Key Exchange protocol is to create session keys to
+   be used in current SILC session.  The keys are valid only for some period
+   of time (usually an hour) or at most until the session ends.  These keys
+   are used to protect packets like commands, command replies and other
+   communication between two entities.  If connection is server to server
+   connection, the keys are used to protect all traffic between those
+   servers.  In client connections usually all the packets are protected
+   with this key except channel messages; channels has their own keys and
+   they are not exchanged with this protocol.
+
+
+2.1 Key Exchange Payloads
+
+   During the key exchange procedure public data is sent between initiator
+   and responder.  This data is later used in the key exchange procedure.
+
+
+
+Riikonen                                                        [Page 3]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+   There are several payloads used in the key exchange.  As for all SILC
+   packets, SILC Packet Header, described in [SILC2], is at the start of all
+   packets, the same is done with these payloads as well.  All fields in
+   all payloads are always in MSB (most significant byte first) order.
+   Following descriptions of these payloads.
+
+
+2.1.1 Key Exchange Start Payload
+
+   Key exchange between two entities always begins with a
+   SILC_PACKET_KEY_EXCHANGE packet containing Key Exchange Start Payload.
+   When performing key exchange between client and server, the client sends
+   Key Exchange Start Payload to server filled with all security properties
+   that the client supports.  Server then checks if it supports the security
+   properties.
+
+   It then sends a Key Exchange Start Payload to client filled with security
+   properties it selected from the payload client originally sent.  The
+   payload sent by server must include only one chosen property per list.
+
+   When performing key exchange between server and server, the server who
+   is contacting sends the Key Exchange Start Payload with security property
+   list it supports to the other server.  The contacted party then chooses
+   the preferred properties same way as previously described.  It then
+   replies with the properties it wanted same way as previously described.
+
+   The Key Exchange Start Payload is used to tell connecting entities what
+   security properties and algorithms should be used in the communication.
+   If perfect forward secrecy (PFS) is not desired (PFS is undefined by
+   default) Key Exchange Start Payload is sent only once per session, thus,
+   for example, re-keying will not cause sending of a new payload.  If PFS
+   is desired, re-keying will always cause new key exchange thus causes
+   sending of a new Key Exchange Start Payload.
+
+   When performing first key exchange this payload is never encrypted, as
+   there are no existing keys to encrypt it with.  If performing re-keying
+   (PFS was selected) this payload is encrypted with the existing key and
+   encryption algorithm.
+
+   Cookie is also send in this payload.  Cookie is used to uniform the
+   payload so that none of the key exchange parties cannot determine this
+   payload before hand.  The cookie must be returned to the original sender
+   by the responder.
+
+   Following diagram represents the Key Exchange Start Payload.  The lists
+   mentioned below are always comma (`,') separated and the list must
+   not include spaces (` ').
+
+
+
+
+Riikonen                                                        [Page 4]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |   RESERVED    |     Flags     |         Payload Length        |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     +                                                               +
+     |                                                               |
+     +                            Cookie                             +
+     |                                                               |
+     +                                                               +
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |   Key Exchange Grp Length     |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                      Key Exchange Groups                      ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |        PKCS Alg Length        |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                         PKCS Algorithms                       ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |     Encryption Alg Length     |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                      Encryption Algorithms                    ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |       Hash Alg Length         |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                        Hash Algorithms                        ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |    Compression Alg Length     |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                     Compression Algorithms                    ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                   Figure 1:  Key Exchange Start Payload
+
+
+
+
+
+
+Riikonen                                                        [Page 5]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+      o RESERVED (1 byte) - Reserved field.  Sender fills this with
+        zeroes (0).
+
+      o Flags (1 byte) - Indicates flags to be used in the key
+        exchange.  Several flags can be set at once by ORing the
+        flags together.  Following flags are reserved for this field.
+
+           No flags              0x00
+
+             In this case the field is ignored.
+
+           No Reply              0x01
+
+             If set the receiver of the payload does not reply to
+             the packet.
+
+           PFS                   0x02
+
+             Perfect Forward Secrecy (PFS) to be used in the
+             key exchange protocol.  If not set, re-keying
+             is performed using the old key.  When PFS is used,
+             re-keying and creating new keys for any particular
+             purpose will cause new key exchange.
+
+             Rest of the flags are reserved for the future and
+             must not be set.
+
+      o Payload Length (2 bytes) - Length of the entire Key Exchange
+        Start payload.
+
+      o Cookie (16 bytes) - Cookie that uniforms this payload so
+        that each of the party cannot determine the payload before
+        hand.
+
+      o Key Exchange Grp Length (2 bytes) - The length of the
+        key exchange group list, including this field as well.
+
+      o Key Exchange Group (variable length) - The list of
+        key exchange groups.  See the section 2.1.2 SILC Key Exchange
+        Groups for definitions of these groups.
+
+      o PKCS Alg Length (2 bytes) - The length of the PKCS algorithms
+        list, including this field as well.
+
+      o PKCS Algorithms (variable length) - The list of PKCS
+        algorithms.
+
+      o Encryption Alg Length (2 bytes) - The length of the encryption
+
+
+
+Riikonen                                                        [Page 6]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+        algorithms list, including this field as well.
+
+      o Encryption Algorithms (variable length) - The list of
+        encryption algorithms.
+
+      o Hash Alg Length (2 bytes) - The length of the Hash algorithms
+        list, including this field as well.
+
+      o Hash Algorithms (variable length) - The list of Hash algorithms.
+
+      o Compression Alg Length (2 bytes) - The length of the
+        compression algorithms list, including this field as well.
+
+      o Compression Algorithms (variable length) - The list of
+        compression algorithms.
+
+
+2.1.2 Key Exchange 1 Payload
+
+   Key Exchange 1 Payload is used to deliver computed public data from
+   initiator to responder.  This data is used to compute the shared secret,
+   later by all parties.  Key Exchange 1 Payload is only sent after the
+   SILC_PACKET_KEY_EXCHANGE packet and the Key Exchange Start Payload has
+   been processed by all the parties.
+
+   This payload sends the initiator's public key to the responder.  Responder
+   may need the public key in which case it should be checked to be trusted
+   by the responder.
+
+   The payload may only be sent with SILC_PACKET_KEY_EXCHANGE_1 packet.
+   It must not be sent in any other packet type.  Following diagram
+   represent the Key Exchange 1 Payload.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Riikonen                                                        [Page 7]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |       Public Key Length       |        Public Key Type        |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~            Public Key of the Host (or certificate)            ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |      Public Data Length       |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                 Public Data (e = g ^ x mod p)                 ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                     Figure 2:  Key Exchange 1 Payload
+
+
+      o Public Key Length (2 bytes) - The length of the public key
+        (or certificate), including this field and public key type
+        field as well.
+
+      o Public Key Type (2 bytes) - The public key (or certificate)
+        type.  This field indicates the type of the public key in
+        the packet.  Following types are defined:
+
+           1    SILC style public key (mandatory)
+           2    SSH2 style public key (optional)
+           3    X.509 Version 3 certificate (optional)
+           4    OpenPGP certificate (optional)
+           5    SPKI certificate (optional)
+
+        The only required type to support is type number 1.  See
+        [SILC1] for the SILC public key specification.  See
+        SSH public key specification in [SSH-TRANS].  See X.509v3
+        certificate specification in [PKIX-Part1].  See OpenPGP
+        certificate specification in [PGP].  See SPKI certificate
+        specification in [SPKI].  If this field includes zero (0)
+        or unsupported type number the protocol must be aborted
+        sending SILC_PACKET_FAILURE message.
+
+      o Public Data Length (2 bytes) - The length of the public
+        data computed by the responder, including this field
+        as well.
+
+      o Public Data (variable length) - The public data to be
+        sent to the responder.  See section 2.2 Key Exchange
+
+
+
+Riikonen                                                        [Page 8]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+        Procedure for detailed description how this field is
+        computed.  This value is binary encoded.
+
+
+2.1.3 Key Exchange 2 Payload
+
+   Key Exchange 2 Payload is used to deliver public key, computed public
+   data and signature from responder to initiator.  Initiator uses these
+   public parts of the key exchange protocol to compute the shared secret.
+
+   The payload may only be sent with SILC_PACKET_KEY_EXCHANGE_2 packet.
+   It must not be sent in any other packet type.  Following diagram
+   represent the Key Exchange 2 Payload.
+
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |       Public Key Length       |        Public Key Type        |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~            Public Key of the Host (or certificate)            ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |       Public Data Length      |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                 Public Data (f = g ^ y mod p)                 ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |        Signature Length       |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                        Signature Data                         ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                     Figure 3:  Key Exchange 2 Payload
+
+
+
+      o Public Key Length (2 bytes) - The length of the public key
+        (or certificate), including this field and public key type
+        field as well.
+
+      o Public Key Type (2 bytes) - The public key (or certificate)
+        type.  This field indicates the type of the public key in
+
+
+
+Riikonen                                                        [Page 9]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+        the packet.  See previous sections for defined public key
+        types.
+
+      o Public Key of the host (variable length) - The public
+        key of the sender (or its certificate).  This is verified
+        by the receiver of the packet.  The type of this field
+        is indicated by previous Public Key Type field.
+
+      o Public Data Length (2 bytes) - The length of the public
+        data computed by the responder, including this field
+        as well.
+
+      o Public Data (variable length) - The public data computed
+        by the responder.  See section 2.2 Key Exchange Procedure
+        for detailed description how this field is computed.  This
+        value is binary encoded.
+
+      o Signature Length (2 bytes) - The length of the signature,
+        including the length of this field as well.
+
+      o Signature Data (variable length) - The signature signed
+        by the responder.  The receiver of this signature must
+        verify it.  The verification is done using the public
+        key received in this same payload.  See section 2.2
+        Key Exchange Procedure for detailed description how
+        to produce the signature.
+
+
+2.2 Key Exchange Procedure
+
+      The key exchange begins by sending SILC_PACKET_KEY_EXCHANGE packet with
+      Key Exchange Start Payload to select the security properties to be used
+      in the key exchange and later in the  communication.
+
+      After Key Exchange Start Payload has been processed by both of the
+      parties the protocol proceeds as follows:
+
+
+      Setup:  p is a large and public safe prime.  This is one of the
+              Diffie Hellman groups.  q is order of subgroup (largest
+              prime factor of p).  g is a generator and is defined
+              along with the Diffie Hellman group.
+
+          1.  Initiator generates a random number x, where 1 < x < q,
+              and computes e = g ^ x mod p.  The result e is then
+              encoded into Key Exchange 1 Payload and sent
+              to the responder.
+
+
+
+
+Riikonen                                                       [Page 10]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+          2.  Responder generates a random number y, where 1 < y < q,
+              and computes f = g ^ y mod p.  It then computes the
+              shared secret KEY = e ^ y mod p, and, a hash value
+              HASH = hash(Key Exchange Start Payload data | Host public
+              key (or certificate) | e | f | KEY).  It then signs
+              the HASH value with its private key resulting a signature
+              SIGN.
+
+              It then encodes its public key (or certificate), f and
+              SIGN into Key Exchange 2 Payload and sends it to the
+              initiator.
+
+
+          3.  Initiator verifies that the public key provided in
+              the payload is authentic, or if certificates are used
+              it verifies the certificate.  Initiator may accept
+              the public key without verifying it, however, doing
+              so may result to insecure key exchange (accepting the
+              public key without verifying may be desirable for
+              practical reasons on many environments.  For long term
+              use this is never desirable, in which case certificates
+              would be the preferred method to use).
+
+              Initiator then computes the shared secret KEY =
+              f ^ x mod p, and, a hash value HASH in the same way as
+              responder did in phase 2.  It then verifies the
+              signature SIGN from the payload with the hash value
+              HASH using the received public key.
+
+
+      If any of these phases is to fail SILC_PACKET_FAILURE is sent to
+      indicate that the key exchange protocol failed.  Any other packets must
+      not be sent or accepted during the key exchange except the
+      SILC_PACKET_KEY_EXCHANGE_*, SILC_PACKET_DISCONNECT, SILC_PACKET_FAILURE
+      and/or SILC_PACKET_SUCCESS packets.
+
+      The result of this protocol is a shared secret key material KEY and
+      a hash value HASH.  The key material itself is not fit to be used as
+      a key, it needs to be processed further to derive the actual keys to be
+      used.  The key material is also used to produce other security parameters
+      later used in the communication.  See section 2.3 Processing the Key
+      Material for detailed description how to process the key material.
+
+      After the keys are processed the protocol is ended by sending the
+      SILC_PACKET_SUCCESS packet.  Both entities send this packet to
+      each other.  After this both parties will start using the new keys.
+
+
+
+
+
+Riikonen                                                       [Page 11]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+2.3 Processing the Key Material
+
+      Key Exchange protocol produces secret shared key material KEY.  This
+      key material is used to derive the actual keys used in the encryption
+      of the communication channel.  The key material is also used to derive
+      other security parameters used in the communication.  Key Exchange
+      protocol produces a hash value HASH as well.  This is used in the key
+      deriving process as a session identifier.
+
+      Keys are derived from the key material as follows:
+
+      Sending Initial Vector (IV)     = hash(0 | KEY | HASH)
+      Receiving Initial Vector (IV)   = hash(1 | KEY | HASH)
+      Sending Encryption Key          = hash(2 | KEY | HASH)
+      Receiving Encryption Key        = hash(3 | KEY | HASH)
+      HMAC Key                        = hash(4 | KEY | HASH)
+
+
+   The Initial Vector (IV) is used in the encryption when doing for
+   example CBC mode.  As many bytes as needed are taken from the start of
+   the hash output for IV.  Sending IV is for sending key and receiving IV
+   is for receiving key.  For receiving party, the receiving IV is actually
+   sender's sending IV, and, the sending IV is actually sender's receiving
+   IV.  Initiator uses IV's as they are (sending IV for sending and
+   receiving IV for receiving).
+
+   The Encryption Keys are derived as well from the hash().  If the hash()
+   output is too short for the encryption algorithm more key material is
+   produced in following manner:
+
+      K1 = hash(2 | KEY | HASH)
+      K2 = hash(KEY | K1)
+      K3 = hash(KEY | K1 | K2)  ...
+
+      Sending Encryption Key = K1 | K2 | K3 ...
+
+
+      K1 = hash(3 | KEY | HASH)
+      K2 = hash(KEY | K1)
+      K3 = hash(KEY | K1 | K2)  ...
+
+      Receiving Encryption Key = K1 | K2 | K3 ...
+
+
+   The key is distributed by hashing the previous hash with the original
+   key material.  The final key is a concatenation of the hash values.
+   For Receiving Encryption Key the procedure is equivalent.  Sending key
+   is used only for encrypting data to be sent.  The receiving key is used
+
+
+
+Riikonen                                                       [Page 12]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+   only to decrypt received data.  For receiving party, the receive key is
+   actually sender's sending key, and, the sending key is actually sender's
+   receiving key.  Initiator uses generated keys as they are (sending key
+   for sending and receiving key for sending).
+
+   The HMAC key is used to create MAC values to packets in the communication
+   channel.  As many bytes as needed are taken from the start of the hash
+   output.
+
+   These procedures are performed by all parties of the key exchange
+   protocol.  This must be done before the protocol has been ended by
+   sending the SILC_PACKET_SUCCESS packet.
+
+
+2.4 SILC Key Exchange Groups
+
+   Following groups may be used in the SILC Key Exchange protocol.  The
+   first group diffie-hellman-group1 is mandatory, other groups maybe
+   negotiated to be used in the connection with Key Exchange Start Payload
+   and SILC_PACKET_KEY_EXCHANGE packet.  However, the first group must be
+   proposed in the Key Exchange Start Payload regardless of any other
+   requested group (however, it doesn't have to be the first on the list).
+
+
+2.4.1 diffie-hellman-group1
+
+   The length of this group is 1024 bits.  This is mandatory group.
+   The prime is 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 }.
+
+   Its decimal value is
+
+      179769313486231590770839156793787453197860296048756011706444
+      423684197180216158519368947833795864925541502180565485980503
+      646440548199239100050792877003355816639229553136239076508735
+      759914822574862575007425302077447712589550957937778424442426
+      617334727629299387668709205606050270810842907692932019128194
+      467627007
+
+   Its hexadecimal value is
+
+      FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1
+      29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD
+      EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245
+      E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED
+      EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381
+      FFFFFFFF FFFFFFFF
+
+
+
+
+
+Riikonen                                                       [Page 13]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+   The generator used with this prime is g = 2. The group order q is
+   (p - 1) / 2.
+
+   This group was taken from the OAKLEY specification.
+
+
+2.4.2 diffie-hellman-group2
+
+   The length of this group is 1536 bits.  This is optional group.
+   The prime is 2^1536 - 2^1472 - 1 + 2^64 * { [2^1406 pi] + 741804 }.
+
+   Its decimal value is
+
+      241031242692103258855207602219756607485695054850245994265411
+      694195810883168261222889009385826134161467322714147790401219
+      650364895705058263194273070680500922306273474534107340669624
+      601458936165977404102716924945320037872943417032584377865919
+      814376319377685986952408894019557734611984354530154704374720
+      774996976375008430892633929555996888245787241299381012913029
+      459299994792636526405928464720973038494721168143446471443848
+      8520940127459844288859336526896320919633919
+
+   Its hexadecimal value is
+
+      FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1
+      29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD
+      EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245
+      E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED
+      EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D
+      C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F
+      83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D
+      670C354E 4ABC9804 F1746C08 CA237327 FFFFFFFF FFFFFFFF
+
+   The generator used with this prime is g = 2. The group order q is
+   (p - 1) / 2.
+
+   This group was taken from the OAKLEY specification.
+
+
+2.5 Key Exchange Status Types
+
+   This section defines all key exchange protocol status types that may be
+   returned in the SILC_PACKET_SUCCESS or SILC_PACKET_FAILURE packets to
+   indicate the status of the protocol.  Implementations may map the
+   status types to human readable error message.  All types except the
+   SILC_SKE_STATUS_OK type must be sent in SILC_PACKET_FAILURE packet.
+   Following status types are defined:
+
+
+
+
+Riikonen                                                       [Page 14]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+      0   SILC_SKE_STATUS_OK
+
+          Protocol were exeucted succesfully.
+
+
+      1   SILC_SKE_STATUS_ERROR
+
+          Unknown error occured.  No specific error type is defined.
+
+
+      2   SILC_SKE_STATUS_BAD_PAYLOAD
+
+          Provided KE payload were malformed or included bad fields.
+
+
+      3   SILC_SKE_STATUS_UNSUPPORTED_GROUP
+
+          None of the provided groups were supported.
+
+
+      4   SILC_SKE_STATUS_UNSUPPORTED_CIPHER
+
+          None of the provided ciphers were supported.
+
+
+      5   SILC_SKE_STATUS_UNSUPPORTED_PKCS
+
+          None of the provided public key algorithms were supported.
+
+
+      6   SILC_SKE_STATUS_UNSUPPORTED_HASH_FUNCTION
+
+          None of the provided hash functions were supported.
+
+
+      7   SILC_SKE_STATUS_UNSUPPORTED_PUBLIC_KEY
+
+          Provided public key type is not supported.
+
+
+      8   SILC_SKE_STATUS_INCORRECT_SIGNATURE
+
+          Provided signature was incorrect.
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 15]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+3 SILC Connection Authentication Protocol
+
+   Purpose of Connection Authentication protocol is to authenticate the
+   connecting party with server.  Usually connecting party is client but
+   server may connect to server as well.  Its other purpose is to provide
+   information for the server about which type of connection this is.
+   The type defines whether this is client, server or router connection.
+   Server uses this information to create the ID for the connection.  After
+   the authentication protocol has been successfully completed
+   SILC_PACKET_NEW_ID must be sent to the connecting party by the server.
+   See section New ID Payload in [SILC2] for detailed description for this
+   packet's payload.
+
+   Server must verify the authentication data received and if it is to fail
+   the authentication must be failed by sending SILC_PACKET_FAILURE packet.
+   If everything checks out fine the protocol is ended by server by sending
+   SILC_PACKET_SUCCESS packet.
+
+   The protocol is executed after the SILC Key Exchange protocol.  It must
+   not be executed in any other time.  As it is performed after key exchange
+   protocol all traffic in the connection authentication protocol is
+   encrypted with the exchanged keys.
+
+   The protocol is started by the connecting party by sending
+   SILC_PACKET_CONNECTION_AUTH packet with Connection Auth Payload,
+   described in the next section.  This payload must include the
+   authentication data.  Authentication data is set according
+   authentication method that must be known by both parties. If connecting
+   party does not know what is the mandatory authentication method it must
+   request it from the server by sending SILC_PACKET_CONNECTION_AUTH_REQUEST
+   packet.  This packet is not part of this protocol and is described in
+   section Connection Auth Request Payload in [SILC2].  However, if
+   connecting party already knows the mandatory authentication method
+   sending the request is not necessary.
+
+   See [SILC1] and section Connection Auth Request Payload in [SILC2] also
+   for the list of different authentication methods.  Authentication method
+   may also be NONE, in which case the server does not require
+   authentication at all.  However, in this case the protocol still must be
+   executed; the authentication data just is empty indicating no
+   authentication is required.
+
+   If authentication method is passphrase the authentication data is
+   plaintext passphrase.  As the payload is entirely encrypted it is safe
+   to have plaintext passphrase.  3.2.1 Passphrase Authentication for
+   more information.
+
+
+
+
+
+Riikonen                                                       [Page 16]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+   If authentication method is public key authentication the authentication
+   data is signature of the hash value HASH plus Key Exchange Start Payload,
+   established by the SILC Key Exchange protocol.  This signature must then
+   be verified by the server.  See section 3.2.2 Public Key Authentication
+   for more information.
+
+   The connecting party of this protocol must wait after successful execution
+   of this protocol for the SILC_PACKET_NEW_ID packet where it will receive
+   the ID it will be using in the SILC network.  Connecting party cannot
+   start normal SILC session (sending messages or commands) until it has
+   received its ID.  The ID's are always created by the server except
+   for server to server connection where servers create their own ID's.
+
+
+
+3.1 Connection Auth Payload
+
+   Client sends this payload to authenticate itself to the server.  Server
+   connecting to another server also sends this payload.  Server receiving
+   this payload must verify all the data in it and if something is to fail
+   the authentication must be failed by sending SILC_PACKET_FAILURE packet.
+
+   The payload may only be sent with SILC_PACKET_CONNECTION_AUTH packet.
+   It must not be sent in any other packet type.  Following diagram
+   represent the Connection Auth Payload.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |        Payload Length         |        Connection Type        |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                     Authentication Data                       ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                    Figure 4:  Connection Auth Payload
+
+
+      o Payload Length (2 bytes) - Length of the entire Connection
+        Auth Payload.
+
+      o Connection Type (2 bytes) - Indicates the type of the
+        connection.  See section Connection Auth Request Payload
+        in [SILC2] for the list of connection types.  This field must
+        include valid connection type or the packet must be discarded
+        and authentication must be failed.
+
+
+
+Riikonen                                                       [Page 17]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+      o Authentication Data (variable length) - The actual
+        authentication data.  Contents of this depends on the
+        authentication method known by both parties.  If no
+        authentication is required this field does not exist.
+
+
+3.2 Connection Authentication Types
+
+   SILC supports two authentication types to be used in the connection
+   authentication protocol; passphrase or public key based authentication.
+   Following sections defines the authentication methods.  See [SILC2]
+   for defined numerical authentication method types.
+
+
+3.2.1 Passphrase Authentication
+
+   Passphrase authentication or pre-shared-key base authentication is
+   simply an authentication where the party that wants to authenticate
+   itself to the other end sends the passphrase that is required by
+   the other end, for example server.
+
+   If the passphrase matches with the one in the server's end the
+   authentication is successful.  Otherwise SILC_PACKET_FAILURE must be
+   sent to the sender and the protocol execution fails.
+
+   This is required authentication method to be supported by all SILC
+   implementations.
+
+
+3.2.2 Public Key Authentication
+
+   Public key authentication may be used if passphrase based authentication
+   is not desired.  The public key authentication works by sending a
+   signature as authentication data to the other end, say, server.  The
+   server must then verify the signature by the public key of the sender,
+   which the server has received earlier in SKE protocol.
+
+   The signature is computed using the private key of the sender by signing
+   the HASH value provided by the SKE protocol previously, and the Key
+   Exchange Start Payload from SKE protocol that was sent to the server.
+   The server must verify the data, thus it must keep the HASH and the
+   Key Exchange Start Payload saved during SKE and authentication protocols.
+
+   If the verified signature matches the sent signature, the authentication
+   were successful and SILC_PACKET_SUCCESS is sent.  If it failed the protocol
+   execution is stopped and SILC_PACKET_FAILURE is sent.
+
+   This is required authentication method to be supported by all SILC
+
+
+
+Riikonen                                                       [Page 18]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+   implementations.
+
+
+3.3 Connection Authentication Status Types
+
+   This section defines all connection authentication status types that
+   may be returned in the SILC_PACKET_SUCCESS or SILC_PACKET_FAILURE packets
+   to indicate the status of the protocol.  Implementations may map the
+   status types to human readable error message.  All types except the
+   SILC_AUTH_STATUS_OK type must be sent in SILC_PACKET_FAILURE packet.
+   Following status types are defined:
+
+   0   SILC_AUTH_OK
+
+       Protocol was executed succesfully.
+
+
+   1   SILC_AUTH_FAILED
+
+       Authentication failed.
+
+
+4 Security Considerations
+
+   Security is central to the design of this protocol, and these security
+   considerations permeate the specification.
+
+
+5 References
+
+   [SILC1]      Riikonen, P., "Secure Internet Live Conferencing (SILC),
+                Protocol Specification", Internet Draft, June 2000.
+
+   [SILC2]      Riikonen, P., "SILC Packet Protocol", Internet Draft,
+                June 2000.
+
+   [IRC]        Oikarinen, J., and Reed D., "Internet Relay Chat Protocol",
+                RFC 1459, May 1993.
+
+   [SSH-TRANS]  Ylonen, T., et al, "SSH Transport Layer Protocol",
+                Internet Draft.
+
+   [PGP]        Callas, J., et al, "OpenPGP Message Format", RFC 2440,
+                November 1998.
+
+   [SPKI]       Ellison C., et al, "SPKI Certificate Theory", RFC 2693,
+                September 1999.
+
+
+
+
+Riikonen                                                       [Page 19]
+\f
+Internet Draft       Key Exchange and Authentication        28 June 2000
+
+
+   [PKIX-Part1] Housley, R., et al, "Internet X.509 Public Key
+                Infrastructure, Certificate and CRL Profile", RFC 2459,
+                January 1999.
+
+   [Schneier]   Schneier, B., "Applied Cryptography Second Edition",
+                John Wiley & Sons, New York, NY, 1996.
+
+   [Menezes]    Menezes, A., et al, "Handbook of Applied Cryptography",
+                CRC Press 1997.
+
+   [OAKLEY]     Orman, H., "The OAKLEY Key Determination Protocol",
+                RFC 2412, November 1998.
+
+   [ISAKMP]     Maughan D., et al, "Internet Security Association and
+                Key Management Protocol (ISAKMP)", RFC 2408, November
+                1998.
+
+   [IKE]        Harkins D., and Carrel D., "The Internet Key Exhange
+                (IKE)", RFC 2409, November 1998.
+
+   [HMAC]       Krawczyk, H., "HMAC: Keyed-Hashing for Message
+                Authentication", RFC 2104, February 1997.
+
+
+6 Author's Address
+
+   Pekka Riikonen
+   Kasarmikatu 11 A4
+   70110 Kuopio
+   Finland
+
+   EMail: priikone@poseidon.pspt.fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 20]
+\f
\ No newline at end of file
diff --git a/public_html/docs/draft-riikonen-silc-pp-00.txt b/public_html/docs/draft-riikonen-silc-pp-00.txt
new file mode 100644 (file)
index 0000000..fd61810
--- /dev/null
@@ -0,0 +1,2467 @@
+
+
+
+
+
+
+Network Working Group                                      P. Riikonen
+Internet-Draft
+draft-riikonen-silc-pp-00.txt                             28 June 2000
+Expires: 28 Jan 2001
+
+
+                           SILC Packet Protocol
+
+Status of this Memo
+
+   This document is an Internet-Draft.  Internet-Drafts are working
+   documents of the Internet Engineering Task Force (IETF), its areas,
+   and its working groups.  Note that other groups may also distribute
+   working documents as Internet-Drafts.
+
+   Internet-Drafts are draft documents valid for a maximum of six
+   months and may be updated, replaced, or obsoleted by other
+   documents at any time. It is inappropriate to use Internet-Drafts
+   as reference material or to cite them other than as
+   ``work in progress.''
+
+   To learn the current status of any Internet-Draft, please check the
+   ``1id-abstracts.txt'' listing contained in the Internet-Drafts
+   Shadow Directories on ftp.is.co.za (Africa), nic.nordu.net (Europe),
+   munnari.oz.au (Pacific Rim), ds.internic.net (US East Coast), or
+   ftp.isi.edu (US West Coast).
+
+   The distribution of this memo is unlimited.
+
+
+Abstract
+
+   This memo describes a Packet Protocol used in the Secure Internet Live
+   Conferencing (SILC) protocol specified in the Secure Internet Live
+   Conferencing, Protocol Specification Internet Draft [SILC1].  This
+   protocol describes the packet types and packet payloads which defines
+   the contents of the packets.  The protocol provides secure binary packet
+   protocol that assures that the contents of the packets are secured and
+   authenticated.
+
+
+
+
+
+
+
+
+
+
+
+
+Riikonen                                                        [Page 1]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+Table of Contents
+
+   1 Introduction ..................................................  3
+   2 SILC Packet Protocol ..........................................  4
+     2.1 SILC Packet ...............................................  4
+     2.2 SILC Packet Header ........................................  5
+     2.3 SILC Packet Types .........................................  7
+         2.3.1 SILC Packet Payloads ................................ 15
+         2.3.2 Disconnect Payload .................................. 15
+         2.3.3 Success Payload ..................................... 16
+         2.3.4 Failure Payload ..................................... 16
+         2.3.5 Reject Payload ...................................... 17
+         2.3.6 Notify Payload ...................................... 17
+         2.3.7 Error Payload ....................................... 18
+         2.3.8 Channel Message Payload ............................. 19
+         2.3.9 Channel Key Payload ................................. 20
+         2.3.10 Private Message Payload ............................ 23
+         2.3.11 Private Message Key Payload ........................ 24
+         2.3.12 Command Payload .................................... 25
+                2.3.12.1 Command Argument Payload .................. 25
+         2.3.13 Command Reply Payload .............................. 26
+         2.3.14 Connection Auth Request Payload .................... 27
+         2.3.15 New ID Payload ..................................... 28
+         2.3.16 New ID List Payload ................................ 29
+         2.3.17 New Client Payload ................................. 29
+         2.3.18 New Server Payload ................................. 31
+         2.3.19 New Channel Payload ................................ 31
+         2.3.20 New Channel User Payload ........................... 32
+         2.3.21 New Channel List Payload ........................... 33
+         2.3.22 New Channel User List Payload ...................... 34
+         2.3.23 Replace ID Payload ................................. 34
+         2.3.24 Remove ID Payload .................................. 35
+     2.4 SILC ID Types ............................................. 36
+     2.5 Packet Encryption And Decryption .......................... 37
+         2.5.1 Normal Packet Encryption And Decryption ............. 37
+         2.5.2 Channel Message Encryption And Decryption ........... 37
+         2.5.3 Private Message Encryption And Decryption ........... 38
+     2.6 Packet MAC Generation ..................................... 39
+     2.7 Packet Padding Generation ................................. 39
+     2.8 Packet Compression ........................................ 40
+     2.9 Packet Sending ............................................ 40
+     2.10 Packet Reception ......................................... 41
+     2.11 Packet Broadcasting ...................................... 41
+     2.12 Packet Routing ........................................... 42
+     2.13 Packet Tunneling ......................................... 42
+   3 Security Considerations ....................................... 43
+   4 References .................................................... 43
+   5 Author's Address .............................................. 44
+
+
+
+Riikonen                                                        [Page 2]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+List of Figures
+
+   Figure 1:   Typical SILC Packet
+   Figure 2:   SILC Packet Header
+   Figure 3:   Disconnect Payload
+   Figure 4:   Success Payload
+   Figure 5:   Failure Payload
+   Figure 6:   Reject Payload
+   Figure 7:   Notify Payload
+   Figure 8:   Error Payload
+   Figure 9:   Channel Message Payload
+   Figure 10:  Channel Key Payload
+   Figure 11:  Private Message Payload
+   Figure 12:  Private Message Key Payload
+   Figure 13:  Command Payload
+   Figure 14:  Command Argument Payload
+   Figure 15:  Connection Auth Request Payload
+   Figure 16:  New ID Payload
+   Figure 17:  New Client Payload
+   Figure 18:  New Server Payload
+   Figure 19:  New Channel Payload
+   Figure 20:  New Channel User Payload
+   Figure 21:  Replace ID Payload
+   Figure 22:  Remove ID Payload
+
+
+1. Introduction
+
+   This document describes a Packet Protocol used in the Secure Internet
+   Live Conferencing (SILC) protocol specified in the Secure Internet Live
+   Conferencing, Protocol Specification Internet Draft [SILC1].  This
+   protocol describes the packet types and packet payloads which defines
+   the contents of the packets.  The protocol provides secure binary packet
+   protocol that assures that the contents of the packets are secured and
+   authenticated.
+
+   The basis of SILC protocol relies in the SILC packets and it is with
+   out a doubt the most important part of the protocol.  It is also probably
+   the most complicated part of the protocol.  Packets are used all the
+   time in the SILC network to send messages, commands and other information.
+   All packets in SILC network are always encrypted and their integrity
+   is assured by computed MACs.  The protocol defines several packet types
+   and packet payloads.  Each packet type usually has a specific packet
+   payload that actually defines the contents of the packet.  Each packet
+   also includes a default SILC Packet Header that provides sufficient
+   information about the origin of the packet and destination of the
+   packet.
+
+
+
+
+Riikonen                                                        [Page 3]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+2 SILC Packet Protocol
+
+2.1 SILC Packet
+
+   SILC packets deliver messages from sender to receiver securely by
+   encrypting important fields of the packet.  The packet consists of
+   default SILC Packet Header, Padding, Packet Payload data, and, packet
+   MAC.
+
+   The following diagram illustrates typical SILC packet.
+
+
+      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+     |   n bytes   | 1 - n bytes |      n bytes       |  n bytes
+     | SILC Header |   Padding   |    Data Payload    |    MAC
+      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+                      Figure 1:  Typical SILC Packet
+
+
+   SILC Header is always the first part of the packet and its purpose
+   is to provide information about the packet.  It provides for example
+   the packet type, origin of the packet and the destination of the packet.
+   The header is variable in length and first two (2) bytes of the
+   header (thus first two bytes of the packet) are not encrypted.  The
+   first two (2) bytes are the length of the packet which is not encrypted.
+   See following section for description of SILC Packet header.  Packets
+   without SILC header or with malformed SILC header must be dropped.
+
+   Padding follows the packet header.  The purpose of the padding is to
+   make the packet multiple by eight (8) or by the block size of the
+   cipher used in the encryption, which ever is larger.  The maximum
+   length of padding is currently 16 bytes.  The padding is always
+   encrypted.
+
+   Data payload area follows padding and it is the actual data of the
+   packet.  The packet data is the packet payloads defined in this
+   protocol.  The data payload area is always encrypted.
+
+   The last part of SILC packet is the packet MAC that assures the
+   integrity of the packet.  The MAC is always computed from the packet
+   before the encryption is applied to the packet.  If compression is used
+   in the packet the MAC is computed after the compression has been
+   applied.  The compression, on the other hand, is always applied before
+   encryption.
+
+   All fields in all packet payloads are always in MSB (most significant
+   byte first) order.
+
+
+
+Riikonen                                                        [Page 4]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+2.2 SILC Packet Header
+
+   The default SILC packet header is applied to all SILC packets and it is
+   variable in length.  The purpose of SILC Packet header is to provide
+   detailed information about the packet.  The receiver of the packet uses
+   the packet header to parse the packet and gain other relevant parameters
+   of the packet.
+
+   Following diagram represents the default SILC header format.
+   (*) indicates that this field is never encrypted.  Other fields are
+   always encrypted.
+
+
+                           1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |        Payload Length *       |     Flags     |  Packet Type  |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |        Source ID Length       |     Destination ID Length     |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |  Src ID Type  |                                               |
+     +-+-+-+-+-+-+-+-+                                               +
+     |                                                               |
+     ~                           Source ID                           ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |  Dst ID Type  |                                               |
+     +-+-+-+-+-+-+-+-+                                               +
+     |                                                               |
+     ~                         Destination ID                        ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                       Figure 2:  SILC Packet Header
+
+
+      o Payload Length (2 bytes) - Is the length of the packet
+        not including the padding of the packet.  This field must
+        not be encrypted but must always be authenticated.
+
+      o Flags (1 byte) - Indicates flags to be used in packet
+        processing.  Several flags may be set by ORing the flags
+        together.
+
+        Following flags are reserved for this field:
+
+
+
+
+
+
+Riikonen                                                        [Page 5]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+           No flags                  0x00
+
+             In this case the field is ignored.
+
+
+           Private Message Key       0x01
+
+             Indicates that the packet must include private
+             message that is encrypted using private key set by
+             client.  Servers does not know anything about this
+             key and this causes that the private message is
+             not handled by the server at all, it is just
+             passed along.  See section 2.5.3 Private Message
+             Encryption And Decryption for more information.
+
+
+           Broadcast                 0x02
+
+             Marks the packet to be broadcasted.  Client cannot
+             send broadcast packet and normal server cannot send
+             broadcast packet.  Only router server may send broadcast
+             packet.  The router receiving of packet with this flag
+             set must send (broadcast) the packet to its primary
+             route.  If router has several router connections the
+             packet may be sent only to the primary route.  See
+             section 2.11 Packet Broadcasting for description of
+             packet broadcasting.
+
+
+           Tunneled                  0x04
+
+             Marks that the packet is tunneled.  Tunneling means
+             that extra SILC Packet Header has been applied to the
+             original packet.  The outer header has this flag
+             set.  See section 2.13 Packet Tunneling for more
+             information.
+
+
+
+   o Packet Type (1 byte) - Is the type of the packet. Receiver
+     uses this field to parse the packet.  See section 2.3
+     SILC Packets for list of defined packet types.
+
+   o Source ID Length (2 bytes) - Indicates the length of the
+     Source ID field in the header, not including this or any
+     other fields.
+
+
+
+
+
+Riikonen                                                        [Page 6]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   o Destination ID Length (2 bytes) - Indicates the length of the
+     Destination ID field in the header, not including this or
+     any other fields.
+
+   o Src ID Type (1 byte) - Indicates the type of ID in the
+     Source ID field.  See section 2.4 SILC ID Types for
+     defined ID types.
+
+   o Source ID (variable length) - The actual source ID that
+     indicates who is the original sender of the packet.
+
+   o Dst ID Type (1 byte) - Indicates the type of ID in the
+     Destination ID field.  See section 2.4 SILC ID Types for
+     defined ID types.
+
+   o Destination ID (variable length) - The actual source ID that
+     indicates who is the end receiver of the packet.
+
+
+2.3 SILC Packet Types
+
+   SILC packet types defines the contents of the packet and it is used by
+   the receiver to parse the packet.  The packet type is 8 bits, as a one
+   byte, in length.  The range for the packet types are from 0 - 255,
+   where 0 is never sent and 255 is currently reserved for future
+   extensions and must not be defined to any other purpose.  Every SILC
+   specification compliant implementation should support all of these packet
+   types.
+
+   The below list of the SILC Packet types includes reference to the packet
+   payload as well.  Packet payloads are the actual packet, that is, the data
+   that the packet consists of.  Each packet type defines packet payload
+   which usually may only be sent with the specific packet type.
+
+   Most of the packets are packets that must be destined directly to entity
+   that is connected to the sender.  It is not allowed, for example, for
+   router to send disconnect packet to client that is not directly connected
+   to the router.  However, there are some special packet types that may
+   be destined to some entity that the sender has not direct connection
+   with.  These packets are for example private message packets, channel
+   message packets, command packets and some other packets that may be
+   broadcasted in the SILC network.  If the packet is allowed to be sent to
+   indirectly connected entity it is mentioned separately in the packet
+   description (unless it is obvious as in private and channel message
+   packets).  Other packets must not be sent or accepted, if sent, to
+   indirectly connected entities.
+
+   List of SILC Packet types are defined as follows.
+
+
+
+Riikonen                                                        [Page 7]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+      0    SILC_PACKET_NONE
+
+           This type is reserved and it is never sent.
+
+
+      1    SILC_PACKET_DISCONNECT
+
+           This packet is sent to disconnect the remote end.  Reason of
+           the disconnection is sent inside the packet payload.  Client
+           usually does not send this packet.
+
+           Payload of the packet:  See section 2.3.2 Disconnect Payload
+
+
+      2    SILC_PACKET_SUCCESS
+
+           This packet is sent upon successful execution of some protocol.
+           The status of the success is sent in the packet.
+
+           Payload of the packet:  See section 2.3.3 Success Payload
+
+
+      3    SILC_PACKET_FAILURE
+
+           This packet is sent upon failure of some protocol.  The status
+           of the failure is sent in the packet.
+
+           Payload of the packet:  See section 2.3.4 Failure Payload
+
+
+      4    SILC_PACKET_REJECT
+
+           This packet may be sent upon rejection of some protocol.
+           The status of the rejection is sent in the packet.
+
+           Payload of the packet:  See section 2.3.5 Reject Payload
+
+
+      5    SILC_PACKET_NOTIFY
+
+           This packet is used to send notify message, usually from
+           server to client, although it may be sent from server to another
+           server as well.  Client never sends this packet.  Server may
+           send this packet to channel as well when the packet is
+           distributed to all clients on the channel.  Receiver of this
+           packet may ignore the packet if it chooses so.  However, it
+           should not be ignored.
+
+
+
+
+Riikonen                                                        [Page 8]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+           Payload of the packet:  See section 2.3.6 Notify Payload.
+
+
+      6    SILC_PACKET_ERROR
+
+           This packet is sent when an error occurs.  Server may
+           send this packet.  Client never sends this packet.  The
+           client may entirely ignore the packet, however, server is
+           most likely to take action anyway.
+
+           Payload of the packet:  See section 2.3.7 Error Payload.
+
+
+      7    SILC_PACKET_CHANNEL_MESSAGE
+
+           This packet is used to send messages to channels.  The packet
+           includes Channel ID of the channel and the actual message to
+           the channel.  Messages sent to the channel are always protected
+           by channel specific keys.  Channel Keys are distributed by
+           SILC_PACKET_CHANNEL_KEY packet.
+
+           When client sends this packet the destination ID in the SILC
+           header must be the Channel ID of the channel the message is
+           destined to.  If server sends this packet to a client the
+           destination ID in the SILC header must be the Client ID of
+           the client receiving the packet.
+
+           If server sends this packet to router or if router sends this
+           packet to server or another router the destination ID in the
+           SILC header must be the Channel ID of the channel.  Server
+           (including router) distributes this packet only to its local
+           clients who are joined to the channel.  Servers and routers
+           also determines who are on the channel and when this packet
+           needs to be sent, as described in section Client To Client
+           in [SILC1].
+
+           Payload of the packet:  See section 2.3.8 Channel Message
+                                   Payload
+
+
+      8    SILC_PACKET_CHANNEL_KEY
+
+           This packet is used to distribute new key for particular
+           channel.  Each channel has their own independent keys that
+           is used to protect the traffic on the channel.  Only server
+           may send this packet.  This packet may be sent to entity
+           that is indirectly connected to the sender.
+
+
+
+
+Riikonen                                                        [Page 9]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+           Payload of the packet:  See section 2.3.9 Channel Key Payload
+
+
+      9    SILC_PACKET_PRIVATE_MESSAGE
+
+           This packet is used to send private messages from client
+           to another client.  By default, private messages are protected
+           by session keys established by normal key exchange protocol.
+           However, it is possible to use specific key to protect private
+           messages.  SILC_PACKET_PRIVATE_MESSAGE_KEY packet is used to
+           agree the key with the remote client.  Pre-shared key may be
+           used as well if both of the client knows it, however, it needs
+           to be agreed outside SILC.  See more of this in [SILC1].
+
+           Payload of the packet:  See section 2.3.10 Private Message
+                                   Payload
+
+
+      10   SILC_PACKET_PRIVATE_MESSAGE_KEY
+
+           This packet is used to agree about a key to be used to protect
+           the private messages between two clients.  If this is not sent
+           the normal session key is used to protect the private messages
+           inside SILC network.  Agreeing to use specific key to protect
+           private messages adds security, as no server between the two
+           clients will be able to decrypt the private message.  However,
+           servers inside SILC network are considered to be trusted, thus
+           using normal session key to protect private messages does not
+           degree security.  Whether to agree to use specific keys by
+           default or to use normal session keys by default, is
+           implementation specific issue.  See more of this in [SILC1].
+
+           Payload of the packet:  See section 2.3.11 Private Message
+                                   Key Payload
+
+
+      11   SILC_PACKET_COMMAND
+
+           This packet is used to send commands from client to server.
+           Server may send this packet to other servers as well.  All
+           commands are listed in their own section SILC Command Types
+           in [SILC1].  The contents of this packet is command specific.
+           This packet may be sent to entity that is indirectly connected
+           to the sender.
+
+           Payload of the packet:  See section 2.3.12 Command Payload
+
+
+
+
+
+Riikonen                                                       [Page 10]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+      12   SILC_PACKET_COMMAND_REPLY
+
+           This packet is send as reply to the SILC_PACKET_COMMAND packet.
+           The contents of this packet is command specific.  This packet
+           maybe sent to entity that is indirectly connected to the sender.
+
+           Payload of the packet:  See section 2.3.13 Command Reply
+                                   Payload and section 2.3.12 Command
+                                   Payload
+
+
+      13   SILC_PACKET_KEY_EXCHANGE
+
+           This packet is used to start SILC Key Exchange Protocol,
+           described in detail in [SILC3].
+
+           Payload of the packet:  Payload of this packet is described
+                                   in the section SILC Key Exchange
+                                   Protocol and its sub sections in
+                                   [SILC3].
+
+
+      14   SILC_PACKET_KEY_EXCHANGE_1
+
+           This packet is used as part of the SILC Key Exchange Protocol.
+
+           Payload of the packet:  Payload of this packet is described
+                                   in the section SILC Key Exchange
+                                   Protocol and its sub sections in
+                                   [SILC3].
+
+
+      15   SILC_PACKET_KEY_EXCHANGE_2
+
+           This packet is used as part of the SILC Key Exchange Protocol.
+
+           Payload of the packet:  Payload of this packet is described
+                                   in the section SILC Key Exchange
+                                   Protocol and its sub sections in
+                                   [SILC3].
+
+
+      16   SILC_PACKET_CONNECTION_AUTH_REQUEST
+
+           This packet is used to request the authentication method to
+           be used in the SILC Connection Authentication Protocol.  If
+           initiator of the protocol does not know the mandatory
+           authentication method this packet is used to determine it.
+
+
+
+Riikonen                                                       [Page 11]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+           The party receiving this payload must respond with the same
+           packet including the mandatory authentication method.
+
+           Payload of the packet:  See section 2.3.14 Connection Auth
+                                   Request Payload
+
+
+      17   SILC_PACKET_CONNECTION_AUTH
+
+           This packet is used to start and perform the SILC Connection
+           Authentication Protocol.  This protocol is used to authenticate
+           the connecting party.  The protocol is described in detail in
+           [SILC3].
+
+           Payload of the packet:  Payload of this packet is described
+                                   in the section SILC Authentication
+                                   Protocol and it sub sections in [SILC].
+
+
+      18   SILC_PACKET_NEW_ID
+
+           This packet is used to distribute new ID's from server to
+           router and from router to all routers in the SILC network.
+           This is used when for example new client is registered to
+           SILC network.  The newly created ID's of these operations are
+           distributed by this packet.  Only server may send this packet,
+           however, client must be able to receive this packet.
+
+           Payload of the packet:  See section 2.3.15 New ID Payload
+
+
+      19   SILC_PACKET_NEW_ID_LIST
+
+           This packet is used to distribute list of new ID's from
+           server to routers.  This is equivalent to previous packet
+           type except that it may include several ID's.  Client must
+           not send this packet.
+
+           Payload of the packet:  See section 2.3.16 New ID List
+                                   Payload
+
+
+      20   SILC_PACKET_NEW_CLIENT
+
+           This packet is used by client to register itself to the
+           SILC network.  This is sent after key exchange and
+           authentication protocols has been completed.  Client sends
+           various information about itself in this packet.
+
+
+
+Riikonen                                                       [Page 12]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+           Payload of the packet:  See section 2.3.17 New Client Payload
+
+
+      21   SILC_PACKET_NEW_SERVER
+
+           This packet is used by server to register itself to the
+           SILC network.  This is sent after key exchange and
+           authentication protocols has been completed.  Server sends
+           this to the router it connected to, or, if router was
+           connecting, to the connected router.  Server sends
+           its Server ID and other information in this packet.
+           Client must not send or receive this packet.
+
+           Payload of the packet:  See section 2.3.18 New Server Payload
+
+
+      22   SILC_PACKET_NEW_CHANNEL
+
+           This packet is used to notify routers about newly created
+           channel.  Channels are always created by the router and it must
+           notify other routers about the created channel.  Router sends
+           this packet to its primary route.  Client must not send this
+           packet.  This packet maybe sent to entity that is indirectly
+           connected to the sender.
+
+           Payload of the packet:  See section 2.3.19 New Channel Payload
+
+
+      23   SILC_PACKET_NEW_CHANNEL_USER
+
+           This packet is used to notify routers about new user on channel.
+           The packet is sent after user has joined to the channel.  Server
+           may send this packet to its router and router may send this to
+           its primary router.  Client must not send this packet.  This
+           packet maybe sent to entity that is indirectly connected to the
+           sender.
+
+           Payload of the packet:  See section 2.3.20 New Channel User
+                                   Payload
+
+
+      24   SILC_PACKET_NEW_CHANNEL_LIST
+
+           This packet is used to distribute list of created channels
+           from server to routers.  This is equivalent to the packet
+           SILC_PACKET_NEW_CHANNEL except that it may include several
+           payloads. Client must not send this packet.
+
+
+
+
+Riikonen                                                       [Page 13]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+           Payload of the packet:  See section 2.3.21 New Channel List
+                                   Payload
+
+
+      25   SILC_PACKET_NEW_CHANNEL_USER_LIST
+
+           This packet is used to distribute list of users on specific
+           channel from server to routers.  This is equivalent to the
+           packet SILC_PACKET_NEW_CHANNEL_USER except that it may
+           include several payloads.  Client must not send this packet.
+
+           Payload of the packet:  See section 2.3.22 New Channel User
+                                   List Payload
+
+
+      26   SILC_PACKET_REPLACE_ID
+
+           This packet is used to replace old ID with new ID sent in
+           the packet payload.  For example, when client changes its
+           nickname new ID is created and this packet can be used to
+           distribute the new ID and the old ID is removed when it is
+           send in the packet.  Client cannot send or receive this
+           packet.  This packet maybe sent to entity that is indirectly
+           connected to the sender.
+
+           Payload of the packet:  See section 2.3.23 Replace ID Payload
+
+
+      27   SILC_PACKET_REMOVE_ID
+
+           This packet is used to removed ID.  For example, when client
+           exits SILC network its ID is removed.  Client must not send
+           this packet.  This packet maybe sent to entity that is
+           indirectly connected to the sender.
+
+           Payload of the packet:  See section 2.3.24 Remove ID Payload
+
+
+      28   SILC_PACKET_REKEY
+
+           This packet is used to indicate that re-key must be performed
+           for session keys.  See section Session Key Regeneration in
+           [SILC1] for more information.  This packet does not have
+           a payload.
+
+
+
+
+
+
+
+Riikonen                                                       [Page 14]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+      29   SILC_PACKET_REKEY_DONE
+
+           This packet is used to indicate that re-key is performed and
+           new keys must be used hereafter.  This is sent only if re-key
+           was done without PFS option.  If PFS is set, this is not sent
+           as SILC Key Exchange protocol is executed.  This packet does
+           not have a payload.
+
+
+      30 - 254
+
+          Currently undefined commands.
+
+
+      255 SILC_PACKET_MAX
+
+          This type is reserved for future extensions and currently it
+          is not sent.
+
+
+2.3.1 SILC Packet Payloads
+
+   All payloads resides in the main data area of the SILC packet.  However
+   all payloads must be at the start of the data area after the default
+   SILC packet header and padding.  All fields in the packet payload are
+   always encrypted, as, they reside in the data area of the packet which
+   is always encrypted.
+
+   Payloads described in this section are common payloads that must be
+   accepted anytime during SILC session.  Most of the payloads may only
+   be sent with specific packet type which is defined in the description
+   of the payload.
+
+   There are a lot of other payloads in the SILC as well.  However, they
+   are not common in the sense that they could be sent at any time.
+   These payloads are not described in this section.  These are payloads
+   such as SILC Key Exchange payloads and so on.  These are described
+   in [SILC1] and [SILC3].
+
+
+2.3.2 Disconnect Payload
+
+   Disconnect payload is sent upon disconnection.  The payload is simple;
+   reason of disconnection is sent to the disconnected party.
+
+   The payload may only be sent with SILC_PACKET_DISCONNECT packet.  It
+   must not be sent in any other packet type.  Following diagram represents
+   the Disconnect Payload.
+
+
+
+Riikonen                                                       [Page 15]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                      Disconnect Message                       ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                       Figure 3:  Disconnect Payload
+
+
+
+
+      o Disconnect Message (variable length) - Human readable
+        reason of the disconnection.
+
+
+2.3.3 Success Payload
+
+   Success payload is sent when some protocol execution is successfully
+   completed.  The payload is simple; indication of the success is sent.
+   This maybe any data, including binary or human readable data.
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                      Success Indication                       ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                        Figure 4:  Success Payload
+
+
+      o Success Indication (variable length) - Indication of
+        the success.  This maybe for example some flag that
+        indicates the protocol and the success status or human
+        readable success message.  The true length of this
+        payload is available by calculating it from the SILC
+        Packet Header.
+
+
+2.3.4 Failure Payload
+
+   This is opposite of Success Payload.  Indication of failure of
+   some protocol is sent in the payload.
+
+                          1                   2                   3
+
+
+
+Riikonen                                                       [Page 16]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                      Failure Indication                       ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                        Figure 5:  Failure Payload
+
+
+      o Failure Indication (variable length) - Indication of
+        the failure.  This maybe for example some flag that
+        indicates the protocol and the failure status or human
+        readable failure message.  The true length of this
+        payload is available by calculating it from the SILC
+        Packet Header.
+
+
+2.3.5 Reject Payload
+
+   This payload is sent when some protocol is rejected to be executed.
+   Other operations may send this as well that was rejected.  The
+   indication of the rejection is sent in the payload.  The indication
+   may be binary or human readable data.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                       Reject Indication                       ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                         Figure 6:  Reject Payload
+
+
+      o Reject Indication (variable length) - Indication of
+        the rejection.  This maybe for example some flag that
+        indicates the protocol and the rejection status or human
+        readable rejection message.  The true length of this
+        payload is available by calculating it from the SILC
+        Packet Header.
+
+
+2.3.6 Notify Payload
+
+   Notify payload is used to send notify messages.  The payload is usually
+
+
+
+Riikonen                                                       [Page 17]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   sent from server to client, however, server may send it to another
+   server as well.  Client must not send this payload.  The receiver of
+   this payload may totally ignore the contents of the payload, however,
+   notify message should be noted and possibly logged.
+
+   The payload may only be sent with SILC_PACKET_NOTIFY packet.  It must
+   not be sent in any other packet type.  Following diagram represents the
+   Notify Payload.
+
+
+
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                        Notify Message                         ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                         Figure 7:  Notify Payload
+
+
+      o Notify Message (variable length) - Human readable notify
+        message.
+
+
+2.3.7 Error Payload
+
+   Error payload is sent upon error.  Error may occur in various
+   conditions when server sends this packet.  Client may not send this
+   payload but must be able to accept it.  However, client may
+   totally ignore the contents of the packet as server is going to
+   take action on the error anyway.  However, it is recommended
+   that the client takes error packet seriously.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                         Error Message                         ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                         Figure 8:  Error Payload
+
+
+
+
+Riikonen                                                       [Page 18]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+      o Error Message (variable length) - Human readable error
+        message.
+
+
+2.3.8 Channel Message Payload
+
+   Channel messages are the most common messages sent in the SILC.
+   Channel Message Payload is used to send message to channels.  These
+   messages can only be sent if client has joined to some channel.
+   Even though this packet is the most common in SILC it is still
+   special packet.  Some special handling on sending and reception
+   of channel message is required.
+
+   Padding must be applied into this payload since the payload is
+   encrypted separately from other parts of the packet with the
+   channel specific key.  Hence the requirement of the padding.
+   The padding should be random data.  The packet must be made
+   multiple by eight (8) or by the block size of the cipher, which
+   ever is larger.
+
+   The SILC header in this packet is encrypted with the session key
+   of the next receiver of the packet.  Nothing else is encrypted
+   with that key.  Thus, the actual packet and padding to be
+   encrypted with the session key is SILC Header plus padding to it
+   to make it multiple by eight (8) or multiple by the block size
+   of the cipher, which ever is larger.
+
+   Receiver of the the channel message packet is able to determine
+   the channel the message is destined to by checking the destination
+   ID from the SILC Packet header which tells the destination channel.
+   The original sender of the packet is also determined by checking
+   the source ID from the header which tells the who client sent
+   the message.
+
+   The payload may only be sent with SILC_PACKET_CHANNEL_MESSAGE packet.
+   It  must not be sent in any other packet type.  Following diagram
+   represents the Channel Message Payload.
+
+   (*) indicates that the field is not encrypted.
+
+
+
+
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 19]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |        Nickname Length        |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                           Nickname                            ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |         Message Length        |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                         Message Data                          ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |        Padding Length         |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                            Padding                            ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                       Initial Vector *                        ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                    Figure 9:  Channel Message Payload
+
+
+      o Nickname Length (2 bytes) - Indicates the length of the
+        Nickname field, not including any other field.
+
+      o Nickname (variable length) - Nickname of the sender of the
+        channel message.  This should not be trusted as a definite
+        sender of the channel message.  The SILC Packet Header in
+        the packet indicates the true sender of the packet and
+        client should verify that the nickname sent here belongs
+        to the Client ID in the SILC Packet Header.  This nickname
+        is merely provided to be displayed by the client.
+
+        If server is sending this packet this field is not included
+        and zero (0) length must be set to the Nickname Length field.
+
+      o Message Length (2 bytes) - Indicates the length of the
+        the Message Data field in the payload, not including any
+        other field.
+
+
+
+
+
+Riikonen                                                       [Page 20]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+      o Message Data (variable length) - The actual message to
+        the channel.
+
+      o Padding Length (2 bytes) - Indicates the length of the
+        Padding field in the payload, not including any other
+        field.
+
+      o Padding (variable length) - The padding that must be
+        applied because this payload is encrypted separately from
+        other parts of the packet.
+
+      o Initial Vector (variable length) - The initial vector
+        that has been used in packet encryption.  It needs to be
+        used in the packet decryption as well.  What this field
+        includes is implementation issue.  However, it is
+        recommended that it would be random data or, perhaps,
+        a timestamp.  It is not recommended to use zero (0) as
+        initial vector.  This field is not encrypted.  This field
+        is not included into the padding calculation.  Length
+        of this field equals the cipher's block size.  This field
+        is, however, authenticated.
+
+
+2.3.9 Channel Key Payload
+
+   All traffic in channels are protected by channel specific keys.
+   Channel Key Payload is used to distribute channel keys to all
+   clients on the particular channel.  Channel keys are sent when
+   the channel is created, when new user joins to the channel and
+   whenever a user leaves a channel.  Server creates the new
+   channel key and distributes it to the clients by encrypting this
+   payload with the session key shared between the server and
+   the client.  After that, client starts using the key received
+   in this payload to protect the traffic on the channel.
+
+   Channel keys are cell specific thus every router in cell have
+   to create a channel key and distribute it if any client in the
+   cell has joined to a channel.  Channel traffic between cell's
+   are not encrypted using channel keys, they are encrypted using
+   normal session keys between two routers.  Inside a cell, all
+   channel traffic is encrypted with the specified channel key.
+   Channel key should expire peridiocally, say, in one hour, in
+   which case new channel key is created and distributed.
+
+   The payload may only be sent with SILC_PACKET_CHANNEL_KEY packet.
+   It must not be sent in any other packet type.  Following diagram
+   represents the Channel Key Payload.
+
+
+
+
+Riikonen                                                       [Page 21]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |       Channel ID Length       |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                          Channel ID                           ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |      Cipher Name Length       |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                         Cipher Name                           ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |      Channel Key Length       |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                         Channel Key                           ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                      Figure 10:  Channel Key Payload
+
+
+
+      o Channel ID Length (2 bytes) - Indicates the length of the
+        Channel ID field in the payload, not including any other
+        field.
+
+      o Channel ID (variable length) - The Channel ID of the
+        channel this key is meant for.
+
+      o Cipher Name Length (2 bytes) - Indicates the length of the
+        Cipher name field in the payload, not including any other
+        field.
+
+      o Cipher Name (variable length) - Name of the cipher used
+        in the protection of channel traffic.  This name is
+        initially decided by the creator of the channel but it
+        may change during the life time of the channel as well.
+
+      o Channel Key Length (2 bytes) - Indicates the length of the
+        Channel Key field in the payload, not including any other
+        field.
+
+      o Channel Key (variable length) - The actual channel key
+        material.  This key is used as such as key material for
+
+
+
+Riikonen                                                       [Page 22]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+        encryption function.
+
+
+2.3.10 Private Message Payload
+
+   Private Message Payload is used to send private message between
+   two clients (or users for that matter).  The messages are sent only
+   to the specified user and no other user inside SILC network is
+   able to see the message.  The message is protected by the session
+   key established by the SILC Key Exchange Protocol.  However,
+   it is also possible to agree to use specific keys to protect
+   just the private messages.  See section 2.3.11 Private Message
+   Key Payload for detailed description of how to agree to use
+   specific key.
+
+   If normal session key is used to protect the message, every
+   server between the sender client and the receiving client needs
+   to decrypt the packet and always re-encrypt it with the session
+   key of the next receiver of the packet.  See section Client
+   To Client in [SILC1].
+
+   When specific key is used to protect the message, servers between
+   the sender and the receiver needs not to decrypt/re-encrypt the
+   packet.  Section 4.8.2 Client To Client in [SILC1] gives example of
+   this scheme as well.
+
+   The payload may only be sent with SILC_PACKET_PRIVATE_MESSAGE
+   packet.  It must not be sent in any other packet type.  Following
+   diagram represents the Private Message Payload.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |        Nickname Length        |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                            Nickname                           ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                          Message Data                         ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                    Figure 11:  Private Message Payload
+
+
+
+
+
+Riikonen                                                       [Page 23]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+      o Nickname Length (2 bytes) - Indicates the length of the
+        Nickname field, not including any other field.
+
+      o Nickname (variable length) - Nickname of the sender of the
+        private message.  This should not be trusted as a definite
+        sender of the private message.  The SILC Packet Header in
+        the packet indicates the true sender of the packet and
+        client should verify that the nickname sent here belongs
+        to the Client ID in the SILC Packet Header.  This nickname
+        is merely provided to be displayed by the client.
+
+      o Message Data (variable length) - The actual message to
+        the client.  Rest of the packet is reserved for the message
+        data.
+
+
+2.3.11 Private Message Key Payload
+
+   This payload is used to send key from client to another client that
+   is going to be used to protect the private messages between these
+   two clients.  If this payload is not sent normal session key
+   established by the SILC Key Exchange Protocol is used to protect
+   the private messages.
+
+   This payload may only be sent by client to another client.  Server
+   must not send this payload at any time.  After sending this payload
+   the sender of private messages must set the Private Message Key
+   flag into SILC Packet Header.
+
+   The payload may only be sent with SILC_PACKET_PRIVATE_MESSAGE_KEY
+   packet.  It must not be sent in any other packet type.  Following
+   diagram represents the Private Message Key Payload.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |  Private Message Key Length   |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                      Private Message Key                      ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                  Figure 12:  Private Message Key Payload
+
+
+
+
+
+
+Riikonen                                                       [Page 24]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+      o Private Message Key Length (2 bytes) - Indicates the length
+        of the Private Message Key field in the payload, not including
+        any other field.
+
+      o Private Message Key (variable length) - The actual private
+        message key material.  This key is used as such as key material
+        for encryption function.
+
+
+2.3.12 Command Payload
+
+   Command Payload is used to send SILC commands from client to server.
+   Following diagram represents the Command Payload.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     | SILC Command  | Arguments Num |         Payload Length        |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                        Figure 13:  Command Payload
+
+
+      o SILC Command (1 byte) - SILC Command identifier.  This must
+        be set to non-zero value.  If zero (0) value is found in this
+        field the packet must be discarded.
+
+      o Arguments Num (1 byte) - Indicates the number of arguments
+        associated with the command.  If there are no arguments this
+        field is set to zero (0).  The arguments must follow the
+        command payload.
+
+      o Payload Length (2 bytes) - Length of the entire command
+        payload including any command argument payloads associated
+        with this payload.
+
+   See [SILC1] for detailed description of different SILC commands,
+   their arguments and their reply messages.
+
+
+2.3.12.1 Command Argument Payload
+
+   Command Argument Payload is used to set arguments for SILC commands.
+   Number of arguments associated with a command are indicated by the
+   Command Payload in the Arguments Num field.  Command argument
+   payloads may only be used with a command payload and they must
+   always reside right after the command payload.  Incorrect amount of
+
+
+
+Riikonen                                                       [Page 25]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   argument payloads must cause rejection of the packet.  Following
+   diagram represents the Command Argument Payload.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |  Argument Num | Argument Type |         Payload Length        |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                        Argument Data                          ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                   Figure 14:  Command Argument Payload
+
+
+      o Argument Num (1 byte) - Indicates the number of this argument.
+        For first argument this is set to 1, for second argument this
+        is set to 2, and so forth.  If incorrect value is found
+        in this field the packet must be discarded.  Value is
+        incorrect if it is zero (0) or, for example, a third argument
+        does not include value 3.
+
+      o Argument Type (1 byte) - Indicates the type of the argument.
+        Every command specify a number for each argument that maybe
+        associated with the command.  By using this number the receiver
+        of the packet knows what type of argument this is.  The numbers
+        are command specific and has been defined in section SILC
+        Commands in [SILC1].  This field makes it possible to send
+        arguments in free order as this field is used to identify
+        the specific type of the argument.
+
+      o Payload Length (2 bytes) - Length of the argument payload data
+        area not including the length of any other fields in the
+        payload.
+
+      o Argument Data (variable length) - Argument data.
+
+
+2.3.13 Command Reply Payload
+
+   Command Reply Payload is used to send replies to the commands sent
+   by the client.  The Command Reply Payload is identical to the
+   Command Payload hence see the upper sections for Command Payload
+   and for Command Argument Payload specifications.  Command Reply
+   message uses the Command Argument Payload as well.
+
+
+
+
+Riikonen                                                       [Page 26]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   See SILC Commands in [SILC1] for detailed description of different
+   SILC commands, their arguments and their reply messages.
+
+
+2.3.14 Connection Auth Request Payload
+
+   Client may send this payload to server to request the authentication
+   method that must be used in authentication protocol.  If client knows
+   this information beforehand this payload is not necessary to be sent.
+   Server performing authentication with another server may also send
+   this payload to request the authentication method.  If the connecting
+   server already knows this information this payload is not necessary
+   to be sent.
+
+   Server receiving this request must reply with same payload sending
+   the mandatory authentication method.  Algorithms that may be required
+   to be used by the authentication method are the ones already
+   established by the SILC Key Exchange protocol.  See section Key
+   Exchange Start Payload in [SILC3] for detailed information.
+
+   The payload may only be sent with SILC_PACKET_CONNECTION_AUTH_REQUEST
+   packet.  It must not be sent in any other packet type.  Following
+   diagram represents the Connection Auth Request Payload.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |        Connection Type        |     Authentication Method     |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                Figure 15:  Connection Auth Request Payload
+
+
+      o Connection Type (2 bytes) - Indicates the type of the ID.
+        Following connection types are defined:
+
+           1    Client connection
+           2    Server connection
+           3    Router connection
+
+        If any other type is found in this field the packet must be
+        discarded and the authentication must be failed.
+
+      o Authentication Method (2 bytes) - Indicates the authentication
+        method to be used in the authentication protocol.  Following
+        authentication methods are defined:
+
+
+
+
+Riikonen                                                       [Page 27]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+           0    NONE        (mandatory)
+           1    password    (mandatory)
+           2    public key  (mandatory)
+
+        If any other type is found in this field the packet must be
+        discarded and the authentication must be failed.  If this
+        payload is sent as request to receive the mandatory
+        authentication method this field must be set to zero (0),
+        indicating that receiver should send the mandatory
+        authentication method.  The receiver sending this payload
+        to the requesting party, may also set this field to zero (0)
+        to indicate that authentication is not required.  In this
+        case authentication protocol still must be started but
+        server is most likely to respond with SILC_PACKET_SUCCESS
+        immediately.
+
+
+2.3.15 New ID Payload
+
+   New ID Payload is a multipurpose payload.  It is used to send newly
+   created ID's from clients and servers.  When client connects to server
+   and registers itself to the server by sending SILC_PACKET_NEW_CLIENT
+   packet, server replies with this packet by sending the created ID for
+   the client.  Server always creates the ID for the client.
+
+   This payload is also used when server tells its router that new client
+   has registered to the SILC network.  In this case the server sends
+   the Client ID of the client to the router.  Similiary when router
+   distributes information to other routers about the client in the SILC
+   network this payload is used.
+
+   Also, when server connects to router, router uses this payload to inform
+   other routers about new server in the SILC network.  However, every
+   server (or router) creates their own ID's thus the ID distributed by
+   this payload is not created by the distributor in this case.  Servers
+   create their own ID's.  Server registers itself to the network by sending
+   SILC_PACKET_NEW_SERVER to the router it connected to.  The case is same
+   when router connects to another router.
+
+   Hence, this payload is very important and used every time when some
+   new entity is registered to the SILC network.  Client never sends this
+   payload.  Both client and server (and router) may receive this payload.
+
+   The payload may only be sent with SILC_PACKET_NEW_ID packet.  It must
+   not be sent in any other packet type.  Following diagram represents the
+   New ID Payload.
+
+
+
+
+
+Riikonen                                                       [Page 28]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |             ID Type           |           ID Length           |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                           ID Data                             ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                        Figure 16:  New ID Payload
+
+
+      o ID Type (2 bytes) - Indicates the type of the ID.  See
+        section 2.4 SILC ID Types for list of defined ID types.
+
+      o ID Length (2 bytes) - Length of the ID Data area not
+        including the length of any other fields in the payload.
+
+      o ID Data (variable length) - The actual ID data.
+
+
+
+2.3.16 New ID List Payload
+
+   New ID List Payload is used to distribute list of ID's usually from
+   server to router but also from router to other routers in the network.
+   This payload is used, for example, when server is connected to router
+   and the server wants to distribute all of its locally connected clients
+   and locally created channels to the router.  It is convenient in this
+   case to use this payload instead of sending all the information one
+   by one using New ID Payload.
+
+   There is no specific payload for this packet type.  The packet type
+   uses same payload as described in previous section.  To form a list
+   several payloads is put in the packet each after each.  The payload
+   is variable in length but can be calculated by calculating the ID
+   Type field, Length field and the ID Data fields together.  This forms
+   one New ID Payload in the list.
+
+   The list of payloads may only be sent with SILC_PACKET_NEW_ID_LIST
+   packet.  They must not be sent in any other packet type.
+
+
+2.3.17 New Client Payload
+
+   When client is connected to the server, keys has been exchanged and
+   connection has been authenticated client must register itself to the
+
+
+
+Riikonen                                                       [Page 29]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   server.  Clients first packet after key exchange and authentication
+   protocols must be SILC_PACKET_NEW_CLIENT.  This payload tells server all
+   the relevant information about the connected user.  Server creates a new
+   client ID for the client when received this payload and sends it to the
+   client in New ID Payload.
+
+   This payload sends username and real name of the user on the remote host
+   which is connected to the SILC server with SILC client.  The server
+   creates the client ID according the information sent in this payload.
+   The nickname of the user becomes the username sent in this payload.
+   However, client should call NICK command after sending this payload to
+   set the real nickname of the user which is then used to create new
+   client ID.
+
+   The payload may only be sent with SILC_PACKET_NEW_CLIENT packet.  It
+   must not be sent in any other packet type.  Following diagram represents
+   the New Client Payload.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |        Username Length        |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                           Username                            ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |       Real Name Length        |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                           Real Name                           ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                      Figure 17:  New Client Payload
+
+
+      o Username Length (2 bytes) - Length of the username.
+
+      o Username (variable length) - The username of the user on
+        the host where connecting to the SILC server.
+
+      o Real Name Length (2 bytes) - Length of the Real Name.
+
+      o Real Name (variable length) - The real name of the user
+        on the host where connecting to the SILC server.
+
+
+
+
+Riikonen                                                       [Page 30]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+2.3.18 New Server Payload
+
+   This payload is sent by server when it has completed successfully both
+   key exchange and connection authentication protocols.  The server
+   uses this payload to register itself to the SILC network.  The
+   first packet after these key exchange and authentication protocols
+   is SILC_PACKET_NEW_SERVER packet.  The payload includes the Server ID
+   of the server that it has created by itself.  It also includes a
+   name of the server that is associated to the Server ID.
+
+   The payload may only be sent with SILC_PACKET_NEW_SERVER packet.  It
+   must not be sent in any other packet type.  Following diagram represents
+   the New Server Payload.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |       Server ID Length        |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                        Server ID Data                         ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |     Server Name Length        |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                          Server Name                          ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                      Figure 18:  New Server Payload
+
+
+      o Server ID Length (2 bytes) - Length of the ID Data area not
+        including the length of any other fields in the payload.
+
+      o Server ID Data (variable length) - The actual Server ID
+         data.
+
+      o Server Name Length (2 bytes) - Length of the server name.
+
+      o Server Name (variable length) - The server name.
+
+
+2.3.19 New Channel Payload
+
+   Information about newly created channel is broadcasted to all routers
+
+
+
+Riikonen                                                       [Page 31]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   in the SILC network by sending this packet payload.  Channels are
+   created by router of the cell.  Server never creates channels unless
+   it is a standalone server and it does not have router connection,
+   in this case server acts as router.  Normal server sends JOIN command
+   to the router (after it has received JOIN command from client) which
+   then processes the command and creates the channel.  Client never sends
+   this packet.
+
+   The payload may only be sent with SILC_PACKET_NEW_CHANNEL packet.
+   It must not be sent in any other packet type.  Following diagram
+   represents the New Channel Payload.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |      Channel Name Length      |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                         Channel Name                          ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |       Channel ID Length       |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                          Channel ID                           ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                      Figure 19:  New Channel Payload
+
+
+
+      o Channel Name Length (2 bytes) - Length of the channel name.
+
+      o Channel Name (variable length) - The name of the created
+        channel.
+
+      o Channel ID Length (2 bytes) - Length of the Channel ID.
+
+      o Channel ID (variable length) - The created Channel ID.
+
+
+2.3.20 New Channel User Payload
+
+   When client (user) joins to a channel, server must notify routers
+   about the new user on the channel.  Normal server sends this packet
+   payload to its router which then broadcasts the packet further.
+
+
+
+Riikonen                                                       [Page 32]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   Router sends this packet always to its primary router.  Client must
+   not send this packet payload.  The mode of the user is NONE after
+   user has joined to the channel.
+
+   The payload may only be sent with SILC_PACKET_NEW_CHANNEL_USER
+   packet.  It must not be sent in any other packet type.  Following
+   diagram represents the New Channel User Payload.
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |       Channel ID Length       |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                          Channel ID                           ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |       Client ID Length        |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                           Client ID                           ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                   Figure 20:  New Channel User Payload
+
+
+      o Channel ID Length (2 bytes) - Length of the Channel ID.
+
+      o Channel ID (variable length) - The Channel ID of the channel
+        to which the client has joined.
+
+      o Client ID Length (2 bytes) - Length of the Client ID.
+
+      o Client ID (variable length) - The Client ID of the client
+        who has joined the channel.
+
+
+2.3.21 New Channel List Payload
+
+   This payload is used to distribute list of new channels from server
+   to routers.  It might convenient to send list of new channels when
+   existing server connects to router, instead of sending them one
+   by one.
+
+   There is no specific payload for this packet type.  The packet type
+   uses same payload as described in 2.3.19 New Channel Payload.  To form
+
+
+
+Riikonen                                                       [Page 33]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   a list several payloads is put in the packet each after each.  The
+   payload is variable in length but can be calculated by calculating
+   the length of the fields together.  This forms one New Channel Payload
+   in the list.
+
+   The list of payloads may only be sent with SILC_PACKET_NEW_CHANNEL_LIST
+   packet.  They must not be sent in any other packet type.
+
+
+2.3.22 New Channel User List Payload
+
+   This payload is used to distribute list of channel users on specific
+   channel from server to routers.  It might convenient to send list of
+   channel users when existing server connects to router, instead of
+   sending them one by one.
+
+   There is no specific payload for this packet type.  The packet type
+   uses same payload as described in 2.3.20 New Channel User Payload.
+   To form a list several payloads is put in the packet each after each.
+   The payload is variable in length but can be calculated by calculating
+   the length of the fields together.  This forms one New Channel User
+   Payload in the list.
+
+   The list of payloads may only be sent with packet
+   SILC_PACKET_NEW_CHANNEL_USER_LIST. They must not be sent in any other
+   packet type.
+
+
+2.3.23 Replace ID Payload
+
+   This payload is used to replace old ID with new ID sent in the payload.
+   When ID changes for some entity and the new ID is wanted to replace the
+   old one this payload must be used.  Client cannot send or receive this
+   payload.  Normal server and router server may send and receive this
+   payload.  After this packet has been sent the old ID must not be used
+   anymore.
+
+   The payload may only be sent with SILC_PACKET_REPLACE_ID packet.  It must
+   not be sent in any other packet type.  Following diagram represents the
+   Replace Payload Payload.
+
+
+
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 34]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |          Old ID Type          |         Old ID Length         |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                         Old ID Data                           ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |          New ID Type          |         New ID Length         |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                         New ID Data                           ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                      Figure 21:  Replace ID Payload
+
+
+      o Old ID Type (2 bytes) - Indicates the type of the old ID.  See
+        section 2.4 SILC ID Types for list of defined ID types.
+
+      o Old ID Length (2 bytes) - Length of the old ID Data area not
+        including the length of any other fields in the payload.
+
+      o Old ID Data (variable length) - The actual old ID data.
+
+      o New ID Type (2 bytes) - Indicates the type of the new ID.  See
+        section 2.4 SILC ID Types for list of defined ID types.
+
+      o New ID Length (2 bytes) - Length of the new ID Data area not
+        including the length of any other fields in the payload.
+
+      o New ID Data (variable length) - The actual new ID data.
+
+
+2.3.24 Remove ID Payload
+
+   Remove ID payload is used to remove ID from SILC network.  This is used
+   for example when client exits SILC network.  The server must in this
+   case send this payload to notify that this ID is not valid anymore.
+   After this has been send the old ID must not be used anymore.  Client
+   must not send this payload.
+
+   The payload may only be sent with SILC_PACKET_REMOVE_ID packet.  It must
+   not be sent in any other packet type.  Following diagram represents the
+   Remove Payload Payload.
+
+
+
+
+Riikonen                                                       [Page 35]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |            ID Type            |           ID Length           |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                            ID Data                            ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                       Figure 22:  Remove ID Payload
+
+
+      o ID Type (2 bytes) - Indicates the type of the ID to be
+        removed.  See section 2.4 SILC ID Types for list of defined
+        ID types.
+
+      o ID Length (2 bytes) - Length of the D Data area not including
+        the length of any other fields in the payload.
+
+      o ID Data (variable length) - The actual ID data to be removed.
+
+
+2.4 SILC ID Types
+
+   ID's are extensively used in the SILC network to associate different
+   entities.  Following ID's has been defined to be used in the SILC
+   network.
+
+      0    No ID
+
+         When ever specific ID cannot be used this is used.
+
+      1    Server ID
+
+         Server ID to associate servers.  See the format of
+         this ID in [SILC1].
+
+      2    Client ID
+
+         Client ID to associate clients.  See the format of
+         this ID in [SILC1].
+
+      3    Channel ID
+
+         Channel ID to associate channels.  See the format of
+         this ID in [SILC1].
+
+
+
+
+Riikonen                                                       [Page 36]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+2.5 Packet Encryption And Decryption
+
+   SILC packets are encrypted almost entirely.  Only small part of SILC
+   header is not encrypted as described in section 5.2 SILC Packet Header.
+   The SILC Packet header is the first part of a packet to be encrypted
+   and it is always encrypted with the key of the next receiver of the
+   packet.  The data payload area of the packet is always entirely
+   encrypted and it is usually encrypted with the next receiver's key.
+   However, there are some special packet types and packet payloads
+   that require special encryption process.  These special cases are
+   described in the next sections.  First is described the normal packet
+   encryption process.
+
+
+2.5.1 Normal Packet Encryption And Decryption
+
+   Normal SILC packets are encrypted with the session key of the next
+   receiver of the packet.  The entire SILC Packet header and the packet
+   data payload is is also encrypted with the same key.  Padding of the
+   packet is also encrypted always with the session key, also in special
+   cases.  Computed MAC of the packet must not be encrypted.
+
+   Decryption process in these cases are straightforward.  The receiver
+   of the packet must first decrypt the SILC Packet header, or some parts
+   of it, usually first 16 bytes of it.  Then the receiver checks the
+   packet type from the decrypted part of the header and can determine
+   how the rest of the packet must be decrypted.  If the packet type is
+   any of the special cases described in following sections the packet
+   decryption is special.  If the packet type is not among those special
+   packet types rest of the packet may be decrypted with the same key.
+
+   Also, note that two bytes of the SILC Packet header are not encrypted
+   thus it must be noticed in the decryption process by starting the
+   decryption from the second byte of the header.  This sets some rules
+   to padding generation as well, see the section 2.7 Packet Padding
+   Generation.
+
+   With out a doubt, this sort of decryption processing causes some
+   overhead to packet decryption, but never the less, is required.
+
+
+2.5.2 Channel Message Encryption And Decryption
+
+   Channel Messages (Channel Message Payload) are always encrypted with
+   the channel specific key.  However, the SILC Packet header is not
+   encrypted with that key.  As in normal case, the header is encrypted
+   with the key of the next receiver of the packet, who ever that might
+   be.  Note that in this case the encrypted data area is not touched
+
+
+
+Riikonen                                                       [Page 37]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   at all; it must not be re-encrypted with the session key.
+
+   Receiver of a channel message, who ever that is, is required to decrypt
+   the SILC Packet header to be able to even recognize the packet to be as
+   channel message.  This is same procedure as for normal SILC packets.
+   As the receiver founds the packet to be channel message, rest of the
+   packet processing is special.  Rest of the SILC Packet header is
+   decrypted with the same session key along with the padding of the
+   packet.  After that the packet is protected with the channel specific
+   key and hence can be decrypted only if the receiver is the client on
+   the channel.  See section 2.7 Packet Padding Generation for more
+   information about padding on special packets.
+
+   If the receiver of the channel message is router who is routing the
+   message to another router then it must decrypt the Channel Message
+   payload.  Between routers (that is, between cells) channel messages
+   are protected with session keys shared between the routers.  This
+   causes another special packet processing for channel messages.  If
+   the channel message is received from another router then the entire
+   packet, including Channel Message payload, is encrypted with the
+   session key shared between the routers.  In this case the packet
+   decryption process is as with normal SILC packets.  Hence, if the
+   router is sending channel message to another router the Channel
+   Message payload must have been decrypted and must be re-encrypted
+   with the session key shared between the another router.  In this
+   case the packet encryption is as with any normal SILC packet.
+
+   It must be noted that this is only when the channel messages are sent
+   from router to another router.  In all other cases the channel
+   message encryption and decryption is as described above.  This
+   different processing of channel messages with router to router
+   connection is because channel keys are cell specific.  All cells has
+   their own channel keys thus the channel message traveling from one
+   cell to another must be protected as it would be any normal SILC
+   packet.
+
+
+2.5.3 Private Message Encryption And Decryption
+
+   By default, private message in SILC are protected by session keys.
+   In this case the private message encryption and decryption process is
+   equivalent to normal packet encryption and decryption.
+
+   However, private messages can be protected with private message key
+   which causes the packet to be special packet.  The procedure in this
+   case is very much alike to channel packets.  The actual private message
+   is encrypted with the private message key and other parts of the
+   packet is encrypted with the session key.  See 2.7 Packet Padding
+
+
+
+Riikonen                                                       [Page 38]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   Generation for more information about padding on special packets.
+
+   The difference from channel message processing is that server or router
+   en route never decrypts the actual private message, as it does not
+   have the key to do that.  Thus, when sending packets between router
+   the processing is same as in any other case as well; the packet's header
+   and padding is protected by the session key and the data area is not
+   touched.
+
+   The true receiver of the private message, client, that is, is able
+   to decrypt the private message as it shares the key with the sender
+   of the message.
+
+
+2.6 Packet MAC Generation
+
+   Data integrity of a packet is protected by including a message
+   authentication code (MAC) at the end of the packet.  The MAC is computed
+   from shared secret MAC key, that is established by the SILC Key Exchange
+   protocol, and from the original contents of the packet.  The MAC is
+   always computed before the packet is encrypted, although after it is
+   compressed if compression is used.
+
+   The MAC is computed from entire packet.  Every bit of data in the packet,
+   including SILC Packet Header is used in the MAC computing.  This way
+   the entire packet becomes authenticated.
+
+   If the packet is special packet MAC is computed from the entire packet
+   but part of the packet may be encrypted before the MAC is computed.
+   This is case, for example, with channel messages where the message data
+   is encrypted with key that server may not now.  In this case the MAC
+   has been computed from the encrypted data.
+
+   See [SILC1] for defined and allowed MAC algorithms.
+
+
+2.7 Packet Padding Generation
+
+   Padding is needed in the packet because the packet is encrypted.  It
+   must always be multiple by eight (8) or multiple by the size of the
+   cipher's block size, which ever is larger.  The padding is always
+   encrypted.
+
+   For normal packets the padding is added after the SILC Packet Header
+   and between the Data Payload area.  The padding for normal packets
+   are calculated as follows:
+
+      padding length = 16 - ((packet length - 2) % 16)
+
+
+
+Riikonen                                                       [Page 39]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   The 16 is the maximum padding allowed in SILC packet.  Two (2) is
+   subtracted from the true length of the packet because two (2) bytes
+   is not encrypted in SILC Packet Header, see section 2.2 SILC Packet
+   Header.  Those two bytes that are not encrypted must not be calculated
+   to the padding length.
+
+   For special packets the padding calculation may be different as special
+   packets may be encrypted differently.  In these cases the encrypted
+   data area must already be multiple by the block size thus in this case
+   the padding is calculated only for SILC Packet Header, not for any
+   other area of the packet.  The same algorithm works in this case as
+   well, except that the `packet length' is now the SILC Packet Header
+   length.  In this case, as well, two (2) is subtracted from the
+   length.
+
+   The padding must be random data, preferably, generated by
+   cryptographically strong random number generator.
+
+
+2.8 Packet Compression
+
+   SILC Packets may be compressed.  In this case the data payload area
+   is compressed and all other areas of the packet must remain as they
+   are.  After compression is performed for the data area, the length
+   field of Packet Header must be set to the compressed length of the
+   data.
+
+   The compression must always be applied before encryption.  When
+   the packet is received and decrypted the data area must be decompressed.
+   Note that the true sender of the packet must apply the compression and
+   the true receiver of the packet must apply the decompression.  Any
+   server or router en route must not decompress the packet.
+
+
+2.9 Packet Sending
+
+   The sender of the packet must assemble the SILC Packet Header with
+   correct values.  It must set the Source ID of the header as its own
+   ID.  It must also set the Destination ID of the header to the true
+   destination.  If the destination is client it will be Client ID, if
+   it is server it will be Server ID and if it is channel it will be
+   Channel ID.
+
+   If the sender wants to compress the packet it must apply the
+   compression now.  Sender must also compute the padding as described
+   in above sections.  Then sender must compute the MAC of the packet.
+
+   Then sender encrypts the packet as has been described in above
+
+
+
+Riikonen                                                       [Page 40]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+   sections according whether the packet is normal packet or special
+   packet.  The computed MAC must not be encrypted.
+
+
+2.10 Packet Reception
+
+   On packet reception the receiver must check that all fields in the
+   SILC Packet Header are valid sain.  It must check the flags of the
+   header and act accordingly.  It must also check the MAC of the packet
+   and if it is to be failed the packet must be discarded.  Also if the
+   header of the packet includes any bad fields the packet must be
+   discarded.
+
+   See above sections on the decryption process of the received packet.
+
+   The receiver must also check that the ID's in the header are valid
+   ID's.  Unsupported ID types or malformed ID's must cause packet
+   rejection.  The padding on the reception is always ignored.
+
+   The receiver must also check the packet type and start parsing the
+   packet according to the type.  However, note the above sections on
+   special packet types and their parsing.
+
+
+2.11 Packet Broadcasting
+
+   SILC packets may be broadcasted in SILC network.  However, only router
+   server may send or receive broadcast packets.  Client and normal server
+   must not send broadcast packets and they must ignore broadcast packets
+   if they receive them.  Broadcast packets are sent by setting Broadcast
+   flag to the SILC packet header.
+
+   Broadcasting packets means that the packet is sent to all routers in
+   the SILC network, except to the router that sent the packet.  The router
+   receiving broadcast packet must send the packet to its primary route.
+   The fact that SILC routers may have several router connections may
+   cause problems, such as race conditions inside the SILC network, if
+   care is not taken when broadcasting packets.  Router must not send
+   the broadcast packet to any other route except to its primary route.
+
+   If the primary route of the router is the original sender of the packet
+   the packet must not be sent to the primary route.  This may happen
+   if router has several router connections and some other router uses
+   the router as its primary route.
+
+   Routers use broadcast packets to broadcast for example information
+   about newly registered clients, servers, channels etc. so that all the
+   routers may keep these informations up to date.
+
+
+
+Riikonen                                                       [Page 41]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+2.12 Packet Routing
+
+   Routers are the primary entities in the SILC network that takes care
+   of packet routing.  However, normal servers routes packets as well, for
+   example, when they are routing channel message to the local clients.
+   Routing is quite simple as every packet tells the true origin and the
+   true destination of the packet.
+
+   It is still recommended for routers that has several routing connections
+   to create route cache for those destinations that has faster route than
+   the router's primary route.  This information is available for the router
+   when other router connects to the router.  The connecting party then
+   sends all of its locally connected clients, server and channels.  These
+   informations helps to create the route cache.  Also, when new channels
+   are created to a cell its information is broadcasted to all routers
+   in the network.  Channel ID's are based on router's ID thus it is easy
+   to create route cache based on these informations.  If faster route for
+   destination does not exist in router's route cache the packet must be
+   routed to the primary route (default route).
+
+   For server who receives a packet to be routed to its locally connected
+   client the server must check whether the particular packet type is
+   allowed to be routed to the client.  Not all packets may be sent by
+   some odd entity to client that is indirectly connected to the sender.
+   See section 2.3 SILC Packet Types and paragraph about indirectly connected
+   entities and sending packets to them.  The section mentions the packets
+   that may be sent to indirectly connected entities.  It is clear that some
+   server cannot send, for example, disconnect packet to client that is not
+   directly connected to the server.
+
+
+2.13 Packet Tunneling
+
+   Tunneling is a feature that is available in SILC protocol.  Tunneling
+   means that extra SILC Packet Header is applied to the original packet
+   and thus hiding the original packet entirely.  There can be some
+   interesting applications using tunneling, such as, using ID's based on
+   private network IP addresses inside in the tunneled packet.  This can
+   open many interesting features relating to connecting to private network
+   from the Internet with SILC and many more.  However, this feature is
+   optional currently in SILC as there does not exist thorough analysis of
+   this feature.  It is with out a doubt that there will be many more
+   applications that has not yet been discovered.  Thus, it is left
+   to Internet Community to investigate the use of tunneling in SILC
+   protocol.  This document is updated according those investigations
+   and additional documents on the issue may be written.
+
+
+
+
+
+Riikonen                                                       [Page 42]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+3 Security Considerations
+
+   Security is central to the design of this protocol, and these security
+   considerations permeate the specification.
+
+
+4 References
+
+   [SILC1]      Riikonen, P., "Secure Internet Live Conferencing (SILC),
+                Protocol Specification", Internet Draft, June 2000.
+
+   [SILC3]      Riikonen, P., "SILC Key Exchange and Authentication
+                Protocols", Internet Draft, June 2000.
+
+   [IRC]        Oikarinen, J., and Reed D., "Internet Relay Chat Protocol",
+                RFC 1459, May 1993.
+
+   [SSH-TRANS]  Ylonen, T., et al, "SSH Transport Layer Protocol",
+                Internet Draft.
+
+   [PGP]        Callas, J., et al, "OpenPGP Message Format", RFC 2440,
+                November 1998.
+
+   [SPKI]       Ellison C., et al, "SPKI Certificate Theory", RFC 2693,
+                September 1999.
+
+   [PKIX-Part1] Housley, R., et al, "Internet X.509 Public Key
+                Infrastructure, Certificate and CRL Profile", RFC 2459,
+                January 1999.
+
+   [Schneier]   Schneier, B., "Applied Cryptography Second Edition",
+                John Wiley & Sons, New York, NY, 1996.
+
+   [Menezes]    Menezes, A., et al, "Handbook of Applied Cryptography",
+                CRC Press 1997.
+
+   [OAKLEY]     Orman, H., "The OAKLEY Key Determination Protocol",
+                RFC 2412, November 1998.
+
+   [ISAKMP]     Maughan D., et al, "Internet Security Association and
+                Key Management Protocol (ISAKMP)", RFC 2408, November
+                1998.
+
+   [IKE]        Harkins D., and Carrel D., "The Internet Key Exhange
+                (IKE)", RFC 2409, November 1998.
+
+   [HMAC]       Krawczyk, H., "HMAC: Keyed-Hashing for Message
+                Authentication", RFC 2104, February 1997.
+
+
+
+Riikonen                                                       [Page 43]
+\f
+Internet Draft            SILC Packet Protocol              28 June 2000
+
+
+5 Author's Address
+
+   Pekka Riikonen
+   Kasarmikatu 11 A4
+   70110 Kuopio
+   Finland
+
+   EMail: priikone@poseidon.pspt.fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 44]
+\f
\ No newline at end of file
diff --git a/public_html/docs/draft-riikonen-silc-spec-00.txt b/public_html/docs/draft-riikonen-silc-spec-00.txt
new file mode 100644 (file)
index 0000000..361e865
--- /dev/null
@@ -0,0 +1,3363 @@
+
+
+
+
+
+
+Network Working Group                                      P. Riikonen
+Internet-Draft
+draft-riikonen-silc-spec-00.txt                           28 June 2000
+Expires: 28 Jan 2001
+
+
+                 Secure Internet Live Conferencing (SILC),
+                          Protocol Specification
+
+Status of this Memo
+
+   This document is an Internet-Draft.  Internet-Drafts are working
+   documents of the Internet Engineering Task Force (IETF), its areas,
+   and its working groups.  Note that other groups may also distribute
+   working documents as Internet-Drafts.
+
+   Internet-Drafts are draft documents valid for a maximum of six
+   months and may be updated, replaced, or obsoleted by other
+   documents at any time. It is inappropriate to use Internet-Drafts
+   as reference material or to cite them other than as
+   ``work in progress.''
+
+   To learn the current status of any Internet-Draft, please check the
+   ``1id-abstracts.txt'' listing contained in the Internet-Drafts
+   Shadow Directories on ftp.is.co.za (Africa), nic.nordu.net (Europe),
+   munnari.oz.au (Pacific Rim), ds.internic.net (US East Coast), or
+   ftp.isi.edu (US West Coast).
+
+   The distribution of this memo is unlimited.
+
+
+Abstract
+
+   This memo describes a Secure Internet Live Conferencing (SILC)
+   protocol which provides secure conferencing services over insecure
+   network channel.  SILC is IRC [IRC] like protocol, however, it is
+   not equivalent to IRC and does not support IRC.  Strong cryptographic
+   methods are used to protect SILC packets inside SILC network.  Two
+   other Internet Drafts relates very closely to this memo;  SILC Packet
+   Protocol [SILC2] and SILC Key Exchange and Authentication Protocols
+   [SILC3].
+
+
+
+
+
+
+
+
+
+
+Riikonen                                                        [Page 1]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+Table of Contents
+
+   1 Introduction ..................................................  3
+   2 SILC Concepts .................................................  3
+     2.1 SILC Network Topology .....................................  4
+     2.2 Communication Inside a Cell ...............................  5
+     2.3 Communication in the Network ..............................  6
+     2.4 Channel Communication .....................................  7
+   3 SILC Specification ............................................  7
+     3.1 Client ....................................................  7
+         3.1.1 Client ID ...........................................  8
+     3.2 Server ....................................................  8
+         3.2.1 Server's Local ID List ..............................  9
+         3.2.2 Server ID ........................................... 10
+         3.2.3 SILC Server Ports ................................... 10
+     3.3 Router .................................................... 11
+         3.3.1 Router's Local ID List .............................. 11
+         3.3.2 Router's Global ID List ............................. 12
+         3.3.3 Router's Server ID .................................. 12
+     3.4 Channels .................................................. 12
+         3.4.1 Channel ID .......................................... 13
+     3.5 Operators ................................................. 14
+     3.6 SILC Commands ............................................. 14
+     3.7 SILC Packets .............................................. 15
+     3.8 Packet Encryption ......................................... 15
+         3.8.1 Determination of the Source and the Destination ..... 16
+         3.8.2 Client To Client .................................... 16
+         3.8.3 Client To Channel ................................... 17
+         3.8.4 Server To Server .................................... 18
+     3.9 Key Exchange And Authentication ........................... 18
+     3.10 Algorithms ............................................... 19
+         3.10.1 Ciphers ............................................ 19
+         3.10.2 Public Key Algorithms .............................. 20
+         3.10.3 MAC Algorithms ..................................... 20
+         3.10.4 Compression Algorithms ............................. 20
+     3.11 SILC Public Key .......................................... 21
+   4 SILC Procedures ............................................... 23
+     4.1 Creating Client Connection ................................ 23
+     4.2 Creating Server Connection ................................ 24
+     4.3 Joining to a Channel ...................................... 25
+     4.4 Channel Key Generation .................................... 26
+     4.5 Private Message Sending and Reception ..................... 27
+     4.6 Private Message Key Generation ............................ 27
+     4.7 Channel Message Sending and Reception ..................... 28
+     4.8 Session Key Regeneration .................................. 28
+     4.9 Command Sending and Reception ............................. 29
+   5 SILC Commands ................................................. 29
+     5.1 SILC Commands Syntax ...................................... 29
+
+
+
+Riikonen                                                        [Page 2]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+     5.2 SILC Commands List ........................................ 31
+     5.3 SILC Command Status Types ................................. 54
+         5.3.1 SILC Command Status Payload ......................... 54
+         5.3.2 SILC Command Status List ............................ 54
+   6 Security Considerations ....................................... 58
+   7 References .................................................... 59
+   8 Author's Address .............................................. 60
+
+
+List of Figures
+
+   Figure 1:  SILC Network Topology
+   Figure 2:  Communication Inside cell
+   Figure 3:  Communication Between Cells
+   Figure 4:  SILC Public Key
+   Figure 5:  SILC Command Status Payload
+
+
+1. Introduction
+
+   This document describes a Secure Internet Live Conferencing (SILC)
+   protocol which provides secure conferencing services over insecure
+   network channel.  SILC is IRC [IRC] like protocol, however, it is
+   not equivalent to IRC and does not support IRC.  Strong cryptographic
+   methods are used to protect SILC packets inside SILC network.  Two
+   other Internet Drafts relates very closely to this memo;  SILC Packet
+   Protocol [SILC2] and SILC Key Exchange and Authentication Protocols
+   [SILC3].
+
+   The protocol uses extensively packets as conferencing protocol
+   requires message and command sending.  The SILC Packet Protocol is
+   described in [SILC2] and should be read to fully comprehend this
+   document and protocol.  [SILC2] also describes the packet encryption
+   and decryption in detail.
+
+   The security of SILC protocol and for any security protocol for that
+   matter is based on strong and secure key exchange protocol.  The SILC
+   Key Exchange protocol is described in [SILC3] along with connection
+   authentication protocol and should be read to fully comprehend this
+   document and protocol.
+
+   The SILC protocol has been developed to work on TCP/IP network
+   protocol, although it could be made to work on other network protocols
+   with only minor changes.  However, it is recommended that TCP/IP
+   protocol is used under SILC protocol.  Typical implementation would
+   be made in client-server model.
+
+
+
+
+
+Riikonen                                                        [Page 3]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+2. SILC Concepts
+
+   This section describes various SILC protocol concepts that forms the
+   actual protocol, and in the end, the actual SILC network.  The mission
+   of the protocol is to deliver messages from clients to other clients
+   through routers and servers in secure manner.  The messages may also
+   be delivered from one client to many clients forming a group, also
+   known as a channel.
+
+   This section does not focus to security issues, instead basic network
+   concepts are introduced to make the topology of the SILC network
+   clear.
+
+
+2.1 SILC Network Topology
+
+   SILC network is a cellular network as opposed to tree style network
+   topology.  The rationale for this is to have servers that can perform
+   specific kind of tasks what other servers cannot perform.  This leads
+   to two kinds of servers; normal SILC servers and SILC routers.
+   A difference between normal server and router server is that routers
+   knows everything about everything in the network.  They also do the
+   actual routing of the messages to the correct receiver.  Normal servers
+   knows only about local information and nothing about global information.
+   This makes the network faster as there are less servers that needs to
+   keep global information up to date at all time.
+
+   This, on the other hand, leads to cellular like network, where routers
+   are in the centrum on the cell and servers are connected to the router.
+   Following diagram represents SILC network topology.
+
+
+          ---- ---- ----         ---- ---- ----
+         | S8 | S5 | S4 |       | S7 | S5 | S6 |
+         ----- ---- -----       ----- ---- -----
+        | S7 | S/R1 | S2 | --- | S8 | S/R2 | S4 |
+         ---- ------ ----       ---- ------ ----
+         | S6 | S3 | S1 |       | S1 | S3 | S2 |         ---- ----
+          ---- ---- ----         ---- ---- ----         | S3 | S1 |
+             Cell 1.   \             Cell 2.  | \____  ----- -----
+                        |                     |        | S4 | S/R4 |
+            ---- ---- ----         ---- ---- ----       ---- ------
+           | S7 | S4 | S2 |       | S1 | S3 | S2 |      | S2 | S5 |
+           ----- ---- -----       ----- ---- -----       ---- ----
+          | S6 | S/R3 | S1 | --- | S4 | S/R5 | S5 |       Cell 4.
+           ---- ------ ----       ---- ------ ----
+           | S8 | S5 | S3 |       | S6 | S7 | S8 |     ... etc ...
+            ---- ---- ----         ---- ---- ----
+
+
+
+Riikonen                                                        [Page 4]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+               Cell 3.                Cell 5.
+
+                     Figure 1:  SILC Network Topology
+
+
+   A cell is formed when a server or servers connect to one router.  In
+   SILC network normal server cannot directly connect to other normal
+   server.  Normal server may only connect to SILC router which then
+   routes the messages to the other servers in the cell.  Router servers
+   on the other hand may connect to other routers to form the actual SILC
+   network, as seen in above figure.  However, router is also normal SILC
+   server; clients may connect to it the same way as to normal SILC
+   servers.  Normal server also cannot have active connections to more
+   than one router.  Normal server cannot be connected to two different
+   cells.  Router servers, on the other hand, may have as many router to
+   router connections as needed.
+
+   There are many issues in this network topology that needs to be careful
+   about.  Issues like the size of the cells, the number of the routers in
+   the SILC network and the capacity requirements of the routers.  These
+   issues should be discussed in the Internet Community and additional
+   documents on the issue will be written.
+
+
+2.2 Communication Inside a Cell
+
+   It is always guaranteed that inside a cell message is delivered to the
+   recipient with at most two server hops.  Client who is connected to
+   server in the cell and is talking on channel to other client connected
+   to other server in the same cell, will have its messages delivered from
+   its local server first to the router of the cell, and from the router
+   to the other server in the cell.  Following diagram represents this
+   scenario.
+
+
+                         1 --- S1     S4 --- 5
+                                  S/R
+                          2 -- S2     S3
+                              /        |
+                             4         3
+
+
+                   Figure 2:  Communication Inside cell
+
+
+   Example:  Client 1. connected to Server 1. message sent to
+             Client 4. connected to Server 2. travels from Server 1.
+             first to Router which routes the message to Server 2.
+
+
+
+Riikonen                                                        [Page 5]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+             which then sends it to the Client 4.  All the other
+             servers in the cell will not see the routed message.
+
+
+   If client is connected directly to the router, as router is also normal
+   SILC server, the messages inside the cell are always delivered only with
+   one server hop.  If clients communicating with each other are connected
+   to the same server, no router interaction is needed.  This is the optimal
+   situation of message delivery in the SILC network.
+
+
+2.3 Communication in the Network
+
+   If the message is destined to server that does not belong to local cell
+   the message is routed to the router server to which the destination
+   server belongs, if the local router is connected to destination router.
+   If there is no direct connection to the destination router, the local
+   router routes the message to its primary route.  Following diagram
+   represents message sending between cells.
+
+
+                1 --- S1     S4 --- 5            S2 --- 1
+                         S/R - - - - - - - - S/R
+                 2 -- S2     S3           S1
+                     /        |             \
+                    4         3              2
+
+                   Cell 1.               Cell 2.
+
+
+                  Figure 3:  Communication Between Cells
+
+
+   Example:  Client 5. connected to Server 4. in Cell 1. message sent
+             to Client 2. connected to Server 1. in Cell 2. travels
+             from Server 4. to Router which routes the message to
+             Router in Cell 2, which then routes the message to
+             Server 1.  All the other servers and routers in the
+             network will not see the routed message.
+
+
+   The optimal case of message delivery from client point of view is
+   when clients are connected directly to the routers and the messages
+   are delivered from one router to the other router.
+
+
+
+
+
+
+
+Riikonen                                                        [Page 6]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+2.4 Channel Communication
+
+   Messages may be sent to group of clients as well.  Sending messages to
+   many clients works the same way as sending messages point to point, from
+   message delivery point of view.  Security issues are another matter
+   which are not discussed in this section.
+
+   Router server handles the message routing to multiple recipients.  If
+   any recipient is not in the same cell as the sender the messages are
+   routed further.
+
+   Server distributes the channel message to its local clients who are
+   joined to the channel.  Also, router distributes the message to its
+   local clients on the channel.
+
+
+3. SILC Specification
+
+   This section describes the SILC protocol.  However, [SILC2] and
+   [SILC3] describes other important protocols that are part of this SILC
+   specification and must be read.
+
+
+3.1 Client
+
+   A client is a piece of software connecting to SILC server.  SILC client
+   cannot be SILC server.  Purpose of clients is to provide the user
+   interface of the SILC services for end user.  Clients are distinguished
+   from other clients by unique Client ID.  Client ID is a 128 bit ID that
+   is used in the communication in the SILC network.  The client ID is
+   based on the nickname selected by the user.  User uses logical nicknames
+   in communication which are then mapped to the corresponding Client ID.
+   Client ID's are low level identifications and must not be seen by the
+   end user.
+
+   Clients provide other information about the end user as well. Information
+   such as the nickname of the user, username and the hostname of the end
+   user and user's real name.  See section 3.2 Server for information of
+   the requirements of keeping this information.
+
+   The nickname selected by the user is not unique in the SILC network.
+   There can be 2^8 same nicknames for one IP address. As for comparison to
+   IRC [IRC] where nicknames are unique this is a fundamental difference
+   between SILC and IRC.  This causes the server names to be used along
+   with the nicknames to identify specific users when sending messages.
+   This feature of SILC makes IRC style nickname-wars obsolete as no one
+   owns their nickname; there can always be someone else with the same
+   nickname.  Another difference is that there are no limit of the length
+
+
+
+Riikonen                                                        [Page 7]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   of the nickname in the SILC.
+
+
+3.1.1 Client ID
+
+   Client ID is used to identify users in the SILC network.  The Client ID
+   is unique to the extent that there can be 2^128 different Client ID's.
+   Collisions are not expected to happen.  The Client ID is defined as
+   follows.
+
+      128 bit Client ID based on IPv4 addresses:
+
+      32 bit  ServerID IP address (bits 1-32)
+       8 bit  Random number
+      88 bit  Truncated MD5 hash value of the nickname
+
+      o Server ID IP address - Indicates the server where this
+        client is coming from.  The IP address hence equals the
+        server IP address where to the client has connected.
+
+      o Random number - Random number to further unify the
+        Client ID.  This makes it possible to have 2^8 same
+        nicknames from the same server IP address.
+
+      o MD5 hash - MD5 hash value of the nickname is truncated
+        taking 88 bits from the start of the hash value.  This
+        hash value is used to search the user's Client ID from
+        the ID lists.
+
+   Collisions could occur when more than 2^8 clients using same nickname
+   from the same server IP address is connected to the SILC network.
+   Server must be able to handle this situation by refusing to accept
+   anymore of that nickname.
+
+   Another possible collision may happen with the truncated hash value of
+   the nickname.  It could be possible to have same truncated hash value for
+   two different nicknames.  However, this is not expected to happen nor
+   cause any problems if it would occur.  Nicknames are usually logical and
+   it is unlikely to have two distinct logical nicknames produce same
+   truncated hash value.
+
+
+3.2 Server
+
+   Servers are the most important parts of the SILC network.  They form the
+   basis of the SILC, providing a point to which clients may connect to.
+   There are two kinds of servers in SILC; normal servers and router servers.
+   This section focuses on the normal server and router server is described
+
+
+
+Riikonen                                                        [Page 8]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   in the section 3.3 Router.
+
+   Normal servers may not directly connect to other normal server.  Normal
+   servers may only directly connect to router server.  If the message sent
+   by the client is destined outside the local server it is always sent to
+   the router server for further routing.  Server may only have one active
+   connection to router on same port.  Normal server may not connect to other
+   cell's router except in situations where its cell's router is unavailable.
+
+   Servers and routers in the SILC network are considered to be trusted.
+   With out a doubt, servers that are set to work on ports above 1023 are
+   not considered to be trusted.  Also, the service provider acts important
+   role in the server's trustworthy.
+
+
+3.2.1 Server's Local ID List
+
+   Normal server keeps various information about the clients and their end
+   users connected to it.  Every normal server must keep list of all locally
+   connected clients, Client ID's, nicknames, usernames and hostnames and
+   user's real name.  Normal servers only keeps local information and it
+   does not keep any global information.  Hence, normal servers knows only
+   about their locally connected clients.  This makes servers efficient as
+   they don't have to worry about global clients.  Server is also responsible
+   of creating the Client ID's for their clients.
+
+   Normal server also keeps information about locally created channels and
+   their Channel ID's.
+
+   Hence, local list for normal server includes:
+
+      server list        - Router connection
+         o Server name
+         o Server IP address
+         o Server ID
+         o Sending key
+         o Receiving key
+         o Public key
+
+      client list        - All clients in server
+         o Nickname
+         o Username@host
+         o Real name
+         o Client ID
+         o Sending key
+         o Receiving key
+
+
+
+
+
+Riikonen                                                        [Page 9]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+      channel list       - All channels in server
+         o Channel name
+         o Channel ID
+         o Client ID's on channel
+         o Client ID modes on channel
+         o Channel key
+
+
+
+3.2.2 Server ID
+
+   Servers are distinguished from other servers by unique 64 bit Server ID.
+   The Server ID is used in the SILC to route messages to correct servers.
+   Server ID's also provide information for Client ID's, see section 3.1.1
+   Client ID.  Server ID is defined as follows.
+
+      64 bit Server ID based on IPv4 addresses:
+
+      32 bit  IP address of the server
+      16 bit  Port
+      16 bit  Random number
+
+      o IP address of the server - This is the real IP address of
+        the server.
+
+      o Port - This is the port the server is binded to.
+
+      o Random number - This is used to further unify the Server ID.
+
+   Collisions are not expected to happen in any conditions.  The Server ID
+   is always created by the server itself and server is resposible of
+   distributing it to the router.
+
+
+3.2.3 SILC Server Ports
+
+   SILC uses currently TCP port 334 on SILC network.  However, this is not
+   official port assigned for SILC.  Official port has been requested by
+   the IANA.
+
+   If there are needs to create new SILC networks in the future the port
+   numbers must be officially assigned by the IANA.  Most convenience case
+   would be to assign port numbers upwards from 334.
+
+   Server on network above privileged ports (>1023) should not be trusted
+   as they could have been set up by untrusted party.
+
+
+
+
+
+Riikonen                                                       [Page 10]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+3.3 Router
+
+   Router server in SILC network is responsible for keeping the cell together
+   and routing messages to other servers and to other routers.  Router server
+   is also a normal server thus clients may connect to it as it would be
+   just normal SILC server.
+
+   However, router servers has a lot of important tasks that normal servers
+   do not have.  Router server knows everything about everything in the SILC.
+   They know all clients currently on SILC, all servers and routers and all
+   channels in SILC.  Routers are the only servers in SILC that care about
+   global information and keeping them up to date at all time.  And, this
+   is what they must do.
+
+
+3.3.1 Router's Local ID List
+
+   Router server as well must keep local list of connected clients and
+   locally created channels.  However, this list is extended to include all
+   the informations of the entire cell, not just the server itself as for
+   normal servers.
+
+   However, on router this list is a lot smaller since routers do not keep
+   information about user's nickname, username and hostname and real name
+   since these are not needed by the router.  Router keeps only information
+   that it needs.
+
+   Hence, local list for router includes:
+
+      server list        - All servers in the cell
+         o Server name
+         o Server ID
+         o Router's Server ID
+         o Sending key
+         o Receiving key
+
+      client list        - All clients in the cell
+         o Client ID
+
+      channel list       - All channels in the cell
+         o Channel ID
+         o Client ID's on channel
+         o Client ID modes on channel
+         o Channel key
+
+
+   Note that locally connected clients and other information include all the
+   same information as defined in section section 3.2.1 Server's Local ID
+
+
+
+Riikonen                                                       [Page 11]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   List.
+
+
+3.3.2 Router's Global ID List
+
+   Router server must also keep global list.  Normal servers do not have
+   global list as they know only about local information.  Global list
+   includes all the clients on SILC, their Client ID's, all created channels
+   and their Channel ID's and all servers and routers on SILC and their
+   Server ID's.  That is said, global list is for global information and the
+   list must not include the local information already on the router's local
+   list.
+
+   Note that the global list does not include information like nicknames,
+   usernames and hostnames or user's real names.  Router does not keep
+   these informations as they are not needed by the router.  This
+   information is available from the client's server which maybe queried
+   when needed.
+
+   Hence, global list includes:
+
+      server list        - All servers in SILC
+         o Server name
+         o Server ID
+         o Router's Server ID
+
+      client list        - All clients in SILC
+         o Client ID
+
+      channel list       - All channels in SILC
+         o Channel ID
+         o Client ID's on channel
+         o Client ID modes on channel
+
+
+3.3.3 Router's Server ID
+
+   Router's Server ID's are equivalent to normal Server ID's.  As routers
+   are normal servers as well same types of ID's applies for routers as well.
+   Thus, see section 3.2.2 Server ID.  Server ID's for routers are always
+   created by the remote router where the router is connected to.
+
+
+3.4 Channels
+
+   A channel is a named group of one or more clients which will all receive
+   messages addressed to that channel.  The channel is created when first
+   client requests JOIN command to the channel, and the channel ceases to
+
+
+
+Riikonen                                                       [Page 12]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   exist when the last client leaves it.  When channel exists, any client
+   can reference it using the name of the channel.
+
+   Channel names are unique although the real uniqueness comes from 64 bit
+   Channel ID that unifies each channel.  However, channel names are still
+   unique and no two global channels with same name may exist.  Channel name
+   is a string which begins with `#' character.  There is no limit on the
+   length of the channel name.  Channel names may not contain any spaces
+   (`  '), any non-printable ASCII characters, commas (`,') and wildcard
+   characters.
+
+   Channels can have operators that can administrate the channel and
+   operate all of its modes.  Following operators on channel exist on SILC
+   network.
+
+      o Channel founder - When channel is created the joining client becomes
+        channel founder.  Channel founder is channel operator with some more
+        privileges.  Basically, channel founder can fully operate the channel
+        and all of its modes.  The privileges are limited only to the particular
+        channel.  There can be only one channel founder per channel.  Channel
+        founder supersedes channel operator's privileges.
+
+        Channel founder privileges cannot be removed by any other operator on
+        channel.  When channel founder leaves the channel there is no channel
+        founder on the channel.  Channel founder also cannot be removed by
+        force from the channel.
+
+      o Channel operator - When client joins to channel that has not existed
+        previously it will become automatically channel operator (and channel
+        founder discussed above).  Channel operator is able administrate the
+        channel, set some modes on channel, remove a badly behaving client from
+        the channel and promote other clients to become channel operator.
+        The privileges are limited only to the particular channel.
+
+        Normal channel user may be promoted (opped) to channel operator
+        gaining channel operator privileges.  Channel founder or other channel
+        operator may also demote (deop) channel operator to normal channel
+        user.
+
+
+3.4.1 Channel ID
+
+   Channels are distinguished from other channels by unique Channel ID.
+   The Channel ID is a 64 bit ID and collisions are not expected to happen
+   in any conditions.  Channel names are just for logical use of channels.
+   The Channel ID is created by the server where the channel is created.
+   The Channel ID is defined as follows.
+
+
+
+
+Riikonen                                                       [Page 13]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+      64 bit Channel ID based on IPv4 addresses:
+
+      32 bit  Router's Server ID IP address (bits 1-32)
+      16 bit  Router's Server ID port (bits 33-48)
+      16 bit  Random number
+
+      o Router's Server ID IP address - Indicates the IP address of
+        the router of the cell where this channel is created.  This is
+        taken from the router's Server ID.  This way SILC router knows
+        where this channel resides in the SILC network.
+
+      o Router's Server ID port - Indicates the port of the channel on
+        the server.  This is taken from the router's Server ID.
+
+      o Random number - To further unify the Channel ID.  This makes
+        sure that there are no collisions.  This also means that
+        in a cell there can be 2^16 channels.
+
+
+3.5 Operators
+
+   Operators are normal users with extra privileges to their server or
+   router.  Usually these people are SILC server and router administrators
+   that take care of their own server and clients on them.  The purpose of
+   operators is to administrate the SILC server or router.  However, even
+   an operator with highest privileges is not able to enter invite-only
+   channel, to gain access to the contents of a encrypted and authenticated
+   packets traveling in the SILC network or to gain channel operator
+   privileges on public channels without being promoted.  They have the
+   same privileges as everyone else except they are able to administrate
+   their server or router.
+
+
+3.6 SILC Commands
+
+   Commands are very important part on SILC network especially for client
+   which uses commands to operate on the SILC network.  Commands are used
+   to set nickname, join to channel, change modes and many other things.
+
+   Client usually sends the commands and server replies by sending a reply
+   packet to the command.  Server may also send commands usually to serve
+   the original client's request.  However, server may not send command
+   to client and there are some commands that server must not send.
+
+   Note that the command reply is usually sent only after client has sent
+   the command request but server is allowed to send command reply packet
+   to client even if client has not requested the command.  Client may,
+   however, choose not to accept the command reply, but there are some
+
+
+
+Riikonen                                                       [Page 14]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   command replies that the client should accept.  Example of a such
+   command reply is reply to SILC_COMMAND_CMODE command that the server
+   uses to distribute the channel mode on all clients on the channel
+   when the mode has changed.
+
+   It is expected that some of the commands may be miss-used by clients
+   resulting various problems on the server side.  Every implementation
+   should assure that commands may not be executed more than once, say,
+   in two (2) seconds.  This should be sufficient to prevent the miss-use
+   of commands.
+
+   SILC commands are described in section 5 SILC Commands.
+
+
+3.7 SILC Packets
+
+   Packets are naturally the most important part of the protocol and the
+   packets are what actually makes the protocol.  Packets in SILC network
+   are always encrypted using, usually, the shared secret session key
+   or some other key, for example, channel key, when encrypting channel
+   messages.  The SILC Packet Protocol is a wide protocol and is described
+   in [SILC2].  This document does not define or describe details of
+   SILC packets.
+
+
+3.8 Packet Encryption
+
+   All packets passed in SILC network must be encrypted.  This section
+   defines how packets must be encrypted in the SILC network.  The detailed
+   description of the actual encryption process of the packets are
+   described in [SILC2].
+
+   Client and its server shares secret symmetric session key which is
+   established by the SILC Key Exchange Protocol, described in [SILC3].
+   Every packet sent from client to server, with exception of packets for
+   channels, are encrypted with this session key.
+
+   Channels has their own key that are shared by every client on the channel.
+   However, the channel keys are cell specific thus one cell does not know
+   the channel key of the other cell, even if that key is for same channel.
+   Channel key is also known by the routers and all servers that has clients
+   on the channel.  However, channels may have channel private keys that
+   are entirely local setting for client.  All clients on the channel must
+   know the channel private key before hand to be able to talk on the
+   channel.  In this case, no server or router knows the key for channel.
+
+   Server shares secret symmetric session key with router which is
+   established by the SILC Key Exchange Protocol.  Every packet passed from
+
+
+
+Riikonen                                                       [Page 15]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   server to router, with exception of packets for channels, are encrypted
+   with the shared session key.  Same way, router server shares secret
+   symmetric key with its primary route.  However, every packet passed
+   from router to other router, including packets for channels, are
+   encrypted with the shared session key.  Every router connection has
+   their own session keys.
+
+
+3.8.1 Determination of the Source and the Destination
+
+   The source and the destination of the packet needs to be determined
+   to be able to route the packets to correct receiver.  This information
+   is available in the SILC Packet Header which is included in all packets
+   sent in SILC network.  The SILC Packet Header is described in [SILC2].
+
+   The header is always encrypted with the session key who is next receiver
+   of the packet along the route.  The receiver of the packet, for example
+   a router along the route, is able to determine the sender and the
+   destination of the packet by decrypting the SILC Packet Header and
+   checking the ID's attached to the header.  The ID's in the header will
+   tell to where the packet needs to be sent and where it is coming from.
+
+   The header in the packet does not change during the routing of the
+   packet.  The original sender, for example client, assembles the packet
+   and the packet header and server or router between the sender and the
+   receiver must not change the packet header.
+
+   Note that the packet and the packet header may be encrypted with
+   different keys.  For example, packets to channels are encrypted with
+   the channel key, however, the header is encrypted with the session key
+   as described above.  However, the header and the packet may be encrypted
+   with same key.  This is case, for example, with command packets.
+
+
+3.8.2 Client To Client
+
+   Process of message delivery and encryption from client to another
+   client is as follows.
+
+   Example:  Private message from client to another client on different
+             servers.  Clients do not share private message delivery
+             keys; normal session keys are used.
+
+   o Client 1. sends encrypted packet to its server.  The packet is
+     encrypted with the session key shared between client and its
+     server.
+
+   o Server determines the destination of the packet and decrypts
+
+
+
+Riikonen                                                       [Page 16]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+     the packet.  Server encrypts the packet with session key shared
+     between the server and its router, and sends the packet to the
+     router.
+
+   o Router determines the destination of the packet and decrypts
+     the packet.  Router encrypts the packet with session key
+     shared between the router and the destination server, and sends
+     the packet to the server.
+
+   o Server determines the client to which the packet is destined
+     to and decrypts the packet.  Server encrypts the packet with
+     session key shared between the server and the destination client,
+     and sends the packet to the client.
+
+   o Client 2. decrypts the packet.
+
+
+   Example:  Private message from client to another client on different
+             servers.  Clients has established secret shared private
+             message delivery key with each other and that is used in
+             the message encryption.
+
+   o Client 1. sends encrypted packet to its server.  The packet is
+     encrypted with the private message delivery key shared between
+     clients.
+
+   o Server determines the destination of the packet and sends the
+     packet to the router.
+
+   o Router determines the destination of the packet and sends the
+     packet to the server.
+
+   o Server determines the client to which the packet is destined
+     to and sends the packet to the client.
+
+   o Client 2. decrypts the packet with the secret shared key.
+
+
+   If clients share secret key with each other the private message
+   delivery is much simpler since servers and routers between the
+   clients do not need to decrypt and re-encrypt the packet.
+
+   The process for clients on same server is much simpler as there are
+   no need to send the packet to the router.  The process for clients
+   on different cells is same as above except that the packet is routed
+   outside the cell.  The router of the destination cell routes the
+   packet to the destination same way as described above.
+
+
+
+
+Riikonen                                                       [Page 17]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+3.8.3 Client To Channel
+
+   Process of message delivery from client on channel to all the clients
+   on the channel.
+
+   Example:  Channel of four users; two on same server, other two on
+             different cells.  Client sends message to the channel.
+
+   o Client 1. encrypts the packet with channel key and sends the
+     packet to its server.
+
+   o Server determines local clients on the channel and sends the
+     packet to the Client on the same server.  Server then sends
+     the packet to its router for further routing.
+
+   o Router determines local clients on the channel, if found
+     sends packet to the local clients.  Router determines global
+     clients on the channel and sends the packet to its primary
+     router or fastest route.
+
+   o (Other router(s) do the same thing and sends the packet to
+      the server(s))
+
+   o Server determines local clients on the channel and sends the
+     packet to the client.
+
+   o All clients receiving the packet decrypts the packet.
+
+
+3.8.4 Server To Server
+
+   Server to server packet delivery and encryption is described in above
+   examples. Router to router packet delivery is analogous to server to
+   server.  However, some packets, such as channel packets, are processed
+   differently.  These cases are described later in this document and
+   more in detail in [SILC2].
+
+
+3.9 Key Exchange And Authentication
+
+   Key exchange is done always when for example client connects to server
+   but also when server and router and router and router connects to each
+   other.  The purpose of key exchange protocol is to provide secure key
+   material to be used in the communication.  The key material is used to
+   derive various security parameters used to secure SILC packets.  The
+   SILC Key Exchange protocol is described in detail in [SILC3].
+
+   Authentication is done after key exchange protocol has been successfully
+
+
+
+Riikonen                                                       [Page 18]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   completed.  The purpose of authentication is to authenticate for example
+   client connecting to the server.  However, Usually clients are accepted
+   to connect to server without explicit authentication.  Servers are
+   required use authentication protocol when connecting.  The authentication
+   may be based on passphrase (pre-shared-secret) or public key.  The
+   connection authentication protocol is described in detail in [SILC3].
+
+
+3.10 Algorithms
+
+   This section defines all the allowed algorithms that can be used in
+   the SILC protocol.  This includes mandatory cipher, mandatory public
+   key algorithm and MAC algorithms.
+
+
+3.10.1 Ciphers
+
+   Cipher is the encryption algorithm that is used to protect the data
+   in the SILC packets.  See [SILC2] of the actual encryption process and
+   definition of how it must be done.  SILC has a mandatory algorithm that
+   must be supported in order to be compliant with this protocol.
+
+   Following ciphers are defined in SILC protocol:
+
+      blowfish-cbc    Blowfish in CBC mode  (mandatory)
+      twofish-cbc     Twofish in CBC mode   (optional)
+      rc6-cbc         RC6 in CBC mode       (optional)
+      rc5-cbc         RC5 in CBC mode       (optional)
+      mars-cbc        Mars in CBC mode      (optional)
+      none            No encryption         (optional)
+
+
+   All algorithms must use minimum of 128 bit key, by default.  Several
+   algorithms, however, supports longer keys and it is recommended to use
+   longer keys if they are available.
+
+   Algorithm none does not perform any encryption process at all and
+   thus is not recommended to be used.  It is recommended that no client
+   or server implementation would accept none algorithms except in special
+   debugging mode.
+
+   Additional ciphers may be defined to be used in SILC by using the
+   same name format as above.
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 19]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+3.10.2 Public Key Algorithms
+
+   Public keys are used in SILC to authenticate entities in SILC network
+   and to perform other tasks related to public key cryptography.  The
+   public keys are also used in the SILC Key Exchange protocol [SILC3].
+
+   Following public key algorithms are defined in SILC protocol:
+
+      rsa        RSA  (mandatory)
+      dss        DSS  (optional)
+
+   Both of the algorithms are described in [Scheneir] and [Menezes].
+
+   Additional public key algorithms may be defined to be used in SILC.
+
+
+3.10.3 MAC Algorithms
+
+   Data integrity is protected by computing a message authentication code
+   (MAC) of the packet data.  See [SILC2] for details how to compute the
+   MAC.
+
+   Following MAC algorithms are defined in SILC protocol:
+
+      hmac-sha1        HMAC-SHA1, length = 20  (mandatory)
+      hmac-md5         HMAC-MD5, length = 16   (optional)
+      none             No MAC                  (optional)
+
+   The none MAC is not recommended to be used as the packet is not
+   authenticated when MAC is not computed.  It is recommended that no
+   client or server would accept none MAC except in special debugging
+   mode.
+
+   The HMAC algorithm is described in [HMAC] and hash algorithms that
+   are used as part of the HMACs are described in [Scheneir] and in
+   [Menezes]
+
+   Additional MAC algorithms may be defined to be used in SILC.
+
+
+3.10.4 Compression Algorithms
+
+   SILC protocol supports compression that may be applied to unencrypted
+   data.  It is recommended to use compression on slow links as it may
+   significantly speed up the data transmission.  By default, SILC does not
+   use compression which is the mode that must be supported by all SILC
+   implementations.
+
+
+
+
+Riikonen                                                       [Page 20]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   Following compression algorithms are defined:
+
+      none        No compression               (mandatory)
+      zlib        GBU ZLIB (LZ77) compression  (optional)
+
+   Additional compression algorithms may be defined to be used in SILC.
+
+
+3.11 SILC Public Key
+
+   This section defines the type and format of the SILC public key.  All
+   implementations must support this public key type.  See [SILC3] for
+   other optional public key and certificate types allowed in SILC
+   protocol.  Public keys in SILC may be used to authenticate entities
+   and to perform other tasks related to public key cryptography.
+
+   The format of the SILC Public Key is as follows:
+
+
+                          1                   2                   3
+      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                        Public Key Length                      |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |     Algorithm Name Length     |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                         Algorithm Name                        ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |       Identifier Length       |                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+     |                                                               |
+     ~                           Identifier                          ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     |                                                               |
+     ~                           Public Data                         ~
+     |                                                               |
+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                        Figure 4:  SILC Public Key
+
+
+      o Public Key Length (4 bytes) - Indicates the full length
+        of the public key, not including this field.
+
+      o Algorithm Name Length (2 bytes) - Indicates the length
+
+
+
+Riikonen                                                       [Page 21]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        of the Algorithm Length field, not including this field.
+
+      o Algorithm name (variable length) - Indicates the name
+        of the public key algorithm that the key is.  See the
+        section 3.10.2 Public Key Algorithms for defined names.
+
+      o Identifier Length (2 bytes) - Indicates the length of
+        the Identifier field, not including this field.
+
+      o Identifier (variable length) - Indicates the identifier
+        of the public key.  This data can be used to identify
+        the owner of the key.  The identifier is of following
+        format:
+
+           UN   User name
+           HN   Host name or IP address
+           RN   Real name
+           E    EMail address
+           O    Organization
+           C    Country
+
+
+        Examples of an identifier:
+
+          `UN=priikone, HN=poseidon.pspt.fi, E=priikone@poseidon.pspt.fi'
+
+          `UN=sam, HN=dummy.fi, RN=Sammy Sam, O=Company XYZ, C=Finland'
+
+        At least user name (UN) and host name (HN) must be provided as
+        identifier.  The fields are separated by commas (`,').  If
+        comma is in the identifier string it must be written as `\,',
+        for example, `O=Company XYZ\, Inc.'.
+
+      o Public Data (variable length) - Includes the actual
+        public data of the public key.
+
+        The format of this field for RSA algorithm is
+        as follows:
+
+           4 bytes            Length of e
+           variable length    e
+           4 bytes            Length of n
+           variable length    n
+
+
+        The format of this field for DSS algorithm is
+        as follows:
+
+
+
+
+Riikonen                                                       [Page 22]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+           4 bytes            Length of p
+           variable length    p
+           4 bytes            Length of q
+           variable length    q
+           4 bytes            Length of g
+           variable length    g
+           4 bytes            Length of y
+           variable length    y
+
+        The variable length fields are multiple precession
+        integers encoded as strings in both examples.
+
+        Other algorithms must define their own type of this
+        field if they are used.
+
+   All fields in the public key are in MSB (most significant byte first)
+   order.
+
+
+4 SILC Procedures
+
+   This section describes various SILC procedures such as how the
+   connections are created and registered, how channels are created and
+   so on.  The section describes the procedures only generally as details
+   are described in [SILC2] and [SILC3].
+
+
+4.1 Creating Client Connection
+
+   This section descibres the procedure when client connects to SILC server.
+   When client connects to server the server must perform IP address lookup
+   and reverse IP address lookup to assure that the origin host really is
+   who it claims to be.  Client, host, connecting to server must have
+   both valid IP address and fully qualified domain name (FQDN).
+
+   After that client and server performs SILC Key Exchange protocol which
+   will provide the key material used later in the communication.  The
+   key exchange protocol must be completed successfully before the connection
+   registration may continue.  The SILC Key Exchange protocol is described
+   in [SILC3].
+
+   Typical server implementation would keep a list of connections that it
+   allows to connect to the server.  The implementation would check, for
+   example, the connecting client's IP address from the connection list
+   before the SILC Key Exchange protocol has been started.  Reason for
+   this is that if the host is not allowed to connect to the server there
+   is no reason to perform a key exchange protocol.
+
+
+
+
+Riikonen                                                       [Page 23]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   After successful key exchange protocol the client and server performs
+   connection authentication protocol.  The purpose of the protocol is to
+   authenticate the client connecting to the server.  Flexible
+   implementation could also accept the client to connect to the server
+   without explicit authentication.  However, if authentication is
+   desired for a specific client it may be based on passphrase or
+   public key authentication.  If authentication fails the connection
+   must be terminated.  The connection authentication protocol is described
+   in [SILC3].
+
+   After successful key exchange and authentication protocol the client
+   registers itself by sending SILC_PACKET_NEW_CLIENT packet to the
+   server.  This packet includes various information about the client
+   that the server uses to create the client.  Server creates the client
+   and sends SILC_PACKET_NEW_ID to the client which includes the created
+   Client ID that the client must start using after that.  After that
+   all SILC packets from the client must have the Client ID as the
+   Source ID in the SILC Packet Header, described in [SILC2].
+
+   Client must also get the server's Server ID that is to be used as
+   Destination ID in the SILC Packet Header when communicating with
+   the server (for example when sending commands to the server).  The
+   ID may be resolved in two ways.  Client can take the ID from an
+   previously received packet from server that must include the ID,
+   or to send SILC_COMMAND_INFO command and receive the Server ID as
+   command reply.
+
+   Server may choose not to use the information received in the
+   SILC_PACKET_NEW_CLIENT packet.  For example, if public key or
+   certificate were used in the authentication, server may use those
+   informations rather than what it received from client.  This is suitable
+   way to get the true information about client if it is available.
+
+   The nickname of client is initially set to the username sent in the
+   SILC_PACKET_NEW_CLIENT packet.  User should set the nickname to more
+   suitable by sending SILC_COMMAND_NICK command.  However, this is not
+   required as part of registration process.
+
+   Server must also distribute the information about newly registered
+   client to its router (or if the server is router, to all routers in
+   the SILC network).  More information about this in [SILC2].
+
+
+4.2 Creating Server Connection
+
+   This section descibres the procedure when server connects to its
+   router (or when router connects to other router, the cases are
+   equivalent).  The procedure is very much alike when client connects
+
+
+
+Riikonen                                                       [Page 24]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   to the server thus it is not repeated here.
+
+   One difference is that server must perform connection authentication
+   protocol with proper authentication.  Proper authentication is based
+   on passphrase or public key authentication.
+
+   After server and router has successfully performed the key exchange
+   and connection authentication protocol, the server register itself
+   to the router by sending SILC_PACKET_NEW_SERVER packet.  This packet
+   includes the server's Server ID that it has created by itself and
+   other relevant information about the server.
+
+   After router has received the SILC_PACKET_NEW_SERVER packet it
+   distributes the information about newly registered server to all routers
+   in the SILC network.  More information about this in [SILC2].
+
+   As client needed to resolve the destination ID this must be done by the
+   server that connected to the router, as well.  The way to resolve it is
+   to get the ID from previously received packet.  Server must also start
+   using its own Server ID as Source ID in SILC Packet Header and the
+   router's Server ID as Destination when communicating with the router.
+
+   If the server has already connected clients and locally created
+   channels the server must distribute these informations to the router.
+   The distribution is done by sending packet SILC_PACKET_NEW_CHANNEL.
+   See [SILC2] for more information on this.
+
+
+4.3 Joining to a Channel
+
+   This section describes the procedure when client joins to a channel.
+   Client may join to channel by sending command SILC_COMMAND_JOIN to the
+   server.  If the receiver receiving join command is normal server the
+   server must check its local list whether this channel already exists
+   locally.  This would indicate that some client connected to the server
+   has already joined to the channel.  If this is case the client is
+   joined to the client, new channel key is created and information about
+   newly joined channel is sent to the router.  The new channel key is
+   also distributed to the router and to all clients on the channel.
+
+   If the channel does not exist in the local list the command must be
+   sent to the router which will then perform the actual joining
+   procedure.  When server receives the reply to the command from the
+   router it must be distributed to the client who sent the command
+   originally.  Server will also receive the channel key from the server
+   that it must distribute to the client who originally requested the
+   join command.  The server must also save the channel key.
+
+
+
+
+Riikonen                                                       [Page 25]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   If the receiver of the join command is router it must first check its
+   local list whether anyone in the cell has already joined to the channel.
+   If this is the case the client is joined to the channel and reply is
+   sent to the client.  If the command was sent by server the command reply
+   is sent to the server who sent it.  Then the router must also create
+   new channel key and distribute it to all clients on the channel and
+   all servers that has clients on the channel.
+
+   If the channel does not exist on the router's local list it must
+   check the global list whether the channel exists at all.  If it does
+   the client is joined to the channel as described previously.  If
+   the channel does not exist the channel is created and the client
+   is joined to the channel.  The channel key is also created and
+   distributed as previously described.  The client joining to the created
+   channel is made automatically channel founder and both channel founder
+   and channel operator privileges is set for the client.
+
+   When the router joins the client to the channel it must send
+   information about newly joined client to all routers in the SILC
+   network.  Also, if the channel was created in the process, information
+   about newly created channel must also be distributed to all routers.
+   The distribution of newly created channel is done by sending packet
+   SILC_PACKET_NEW_CHANNEL.
+
+   It is important to note that new channel key is created always when
+   new client joins to channel, whether the channel has existed previously
+   or not.  This way the new client on the channel is not able to decrypt
+   any of the old traffic on the channel.
+
+   Client who receives the reply to the join command must start using
+   the received Channel ID in the channel message communication thereafter.
+   However, client must not start communicating on the channel before
+   it has received the packet SILC_PACKET_CHANNEL_KEY.
+
+   If client wants to know the other clients currently on the channel
+   the client must send SILC_COMMAND_NAMES command to receive a list of
+   channel users.  Server implementation, however, may send command reply
+   packet to SILC_COMMAND_NAMES command after client has joined to the
+   channel even if the client has not sent the command.
+
+
+4.4 Channel Key Generation
+
+   Channel keys are created by router who creates the channel by taking
+   enough randomness from cryptographically strong random number generator.
+   The key is generated always when channel is created, when new client
+   joins a channel and after the key has expired.  Key could expire for
+   example in an hour.
+
+
+
+Riikonen                                                       [Page 26]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   The key must also be re-generated whenever some client leaves a channel.
+   In this case the key is created from scratch by taking enough randomness
+   from the random number generator.  After that the key is distributed to
+   all clients on the channel.  However, channel keys are cell specific thus
+   the key is created only on the cell where the client, who leaved the
+   channel, exists.  While the server or router is creating the new channel
+   key, no other client may join to the channel.  Messages that are sent
+   while creating the new key are still processed with the old key.  After
+   server has sent the SILC_PACKET_CHANNEL_KEY packet must client start
+   using the new key.  If server creates the new key the server must also
+   send the new key to its router.  See [SILC2] on more information about
+   how channel messages must be encrypted and decrypted when router is
+   processing them.
+
+
+4.5 Private Message Sending and Reception
+
+   Private messages are sent point to point.  Client explicitly destines
+   a private message to specific client that is delivered to only to that
+   client.  No other client may receive the private message.  The receiver
+   of the private message is destined in the SILC Packet Header as any
+   other packet as well.
+
+   If the sender of a private message does not know the receiver's Client
+   ID, it must resolve it from server.  There are two ways to resolve the
+   client ID from server; it is recommended that client ipmlementations
+   send SILC_COMMAND_IDENTIFY command to receive the Client ID.  Client
+   may also send SILC_COMMAND_WHOIS command to receive the Client ID.
+   If the sender has received earlier a private message from the receiver
+   it should have cached the Client ID from the SILC Packet Header.
+
+   Receiver of a private message should not explicitly trust the nickname
+   that it receives in the Private Message Payload, described in [SILC2].
+   Implementations could resolve the nickname from server, as described
+   previously, and compare the received Client ID and the SILC Packet
+   Header's Client ID.  The nickname in the payload is merely provided
+   to be displayed for end user.
+
+   See [SILC2] for describtion of private message encryption and decryption
+   process.
+
+
+4.6 Private Message Key Generation
+
+   Private message may be protected by key generated by client.  The key
+   may be generated and sent to the other client by sending packet
+   SILC_PACKET_PRIVATE_MESSAGE_KEY which travels through the network
+   and is secured by session keys.  After that the private message key
+
+
+
+Riikonen                                                       [Page 27]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   is used in the private message communication between those clients.
+   See more information about how this works technically in [SILC2].
+
+   Other choice is to entirely use keys that are not sent through
+   the SILC network at all.  This significantly adds security.  This key
+   would be pre-shared-key that is known by both of the clients.  Both
+   agree about using the key and starts sending packets that indicate
+   that the private message is secured using private message key.  This
+   is the technical aspect mentioned previously that is described
+   in [SILC2].
+
+   If the private message keys are not set to be used, which is the
+   case by default in SILC, the private messages are secured by using
+   normal session keys established by SILC Key Exchange protocol.
+
+
+4.7 Channel Message Sending and Reception
+
+   Channel messages are delivered to group of users.  The group forms a
+   channel and all clients on the channel receives messages sent to the
+   channel.
+
+   Channel messages are destined to channel by specifying the Channel ID
+   as Destination ID in the SILC Packet Header.  The server must then
+   distribute the message to all clients on the channel by sending the
+   channel message destined explicitly to a client on the channel.
+
+   See [SILC2] for describtion of channel message encryption and decryption
+   process.
+
+
+4.8 Session Key Regeneration
+
+   Session keys should be regenerated peridiocally, say, once in an hour.
+   The re-key process is started by sending SILC_PACKET_REKEY packet to
+   other end, to indicate that re-key must be performed.
+
+   If perfect forward secrecy (PFS) flag was selected in the SILC Key
+   Exchange protocol [SILC3] the re-key must cause new key exchange with
+   SKE protocol.  In this case the protocol is secured with the old key
+   and the protocol results to new key material.  See [SILC3] for more
+   information.  After the SILC_PACKET_REKEY packet is sent the sender
+   will perform the SKE protocol.
+
+   If PFS flag was not set, which is the default case, then re-key is done
+   without executing SKE protocol.  In this case, the new key is created by
+   hashing the old key with hash function selected earlier in the SKE
+   protocol.  If the digest length of the hash function is too short for the
+
+
+
+Riikonen                                                       [Page 28]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   key, then the key is distributed as described in section Processing the
+   Key Material in [SILC3].  After both parties has regenerated the session
+   key, both send SILC_PACKET_REKEY_DONE packet to each other.  These packets
+   are still secured with the old key.  After these packets, following
+   packets must be protected with the new key.
+
+
+4.9 Command Sending and Reception
+
+   Client usually sends the commands in the SILC network.  In this case
+   the client simply sends the command packet to server and the server
+   processes it and replies with command reply packet.
+
+   However, if the server is not able to process the command, it is usually
+   sent to the server's router.  This is case for example with commands such
+   as, SILC_COMMAND_JOIN and SILC_COMMAND_WHOIS commands.  However, there
+   are other commands as well.  For example, if client sends the WHOIS
+   command requesting specific information about some client the server must
+   send the WHOIS command to router so that all clients in SILC network
+   are searched.  The router, on the other hand, sends the WHOIS command
+   to further to receive the exact information about the requested client.
+   The WHOIS command travels all the way to the server who owns the client
+   and it replies with command reply packet.  Finally, the server who
+   sent the command receives the command reply and it must be able to
+   determine which client sent the original command.  The server then
+   sends command reply to the client.  Implementations should have some
+   kind of cache to handle, for example, WHOIS information.  Servers
+   and routers along the route could all cache the information for faster
+   referencing in the future.
+
+   The commands sent by server may be sent hop by hop until someone is able
+   to process the command.  However, it is preferred to destine the command
+   as precisely as it is possible.  In this case, other routers en route
+   must route the command packet by checking the true sender and true
+   destination of the packet.  However, servers and routers must not route
+   command reply packets to clients coming from other server.  Client
+   must not accept command reply packet originated from anyone else but
+   from its own server.
+
+
+5 SILC Commands
+
+5.1 SILC Commands Syntax
+
+   This section briefly describes the syntax of the command notions
+   in this document.  Every field in command is separated from each
+   other by whitespaces (` ') indicating that each field is independent
+   argument and each argument must have own Command Argument Payload.
+
+
+
+Riikonen                                                       [Page 29]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   The number of maximum arguments are defined with each command
+   separately.  The Command Argument Payload is described in [SILC2].
+
+   Every command defines specific number for each argument.  Currently,
+   they are defined in ascending order; first argument has number one
+   (1), second has number two (2) and so on.  This number is set into the
+   Argument Type field in the Command Argument Payload.  This makes it
+   possible to send the arguments in free order as the number must be
+   used to identify the type of the argument.  This makes is it also
+   possible to have multiple optional arguments in commands and in
+   command replies.  The number of argument is marked in parentheses
+   before the actual argument.
+
+      Example:  Arguments:  (1) <nickname> (2) <username@host>
+
+
+   Every command replies with Status Payload.  This payload tells the
+   sender of the command whether the command was completed succefully or
+   whether there was an error.  If error occured the payload includes the
+   error type.  In the next section the Status Payload is not described
+   as it is common to all commands and has been described here.  Commands
+   may reply with other arguments as well.  These arguments are command
+   specific and are described in the next section.
+
+   Example command:
+
+      EXAMPLE_COMMAND
+
+        Max Arguments:  3
+            Arguments:  (1) <nickname>[@<server>]  (2) <message>
+                        (3) [<count>]
+
+        The command has maximum of 3 arguments.  However, only first
+        and second arguments are mandatory.
+
+        First argument <nickname> is mandatory but may have optional
+        <nickname@server> format as well.  Second argument is mandatory
+        <message> argument.  Third argument is optional <count> argument.
+
+        The numbers in parentheses are the argument specific numbers
+        that specify the type of the argument in Command Argument Payload.
+        The receiver always knows that, say, argument number two (2) is
+        <message> argument, regardles of the ordering of the arguments in
+        the Command Payload.
+
+
+
+
+
+
+
+Riikonen                                                       [Page 30]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        Reply messages to the command:
+
+        Max Arguments:  4
+            Arguments:  (1) <Status Payload>  (2) [<channel list>]
+                        (3) <idle time>       (4) [<away message>]
+
+        This command may reply with maximum of 4 arguments.  However,
+        only the first and third arguments are mandatory.  The numbers
+        in the parentheses have the same meaning as in the upper
+        command sending specification.
+
+        Every command reply with <Status Payload>, it is mandatory
+        argument for all command replies and for this reason it is not
+        described in the command reply descriptions.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_TOO_MANY_TARGETS
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_NO_SUCH_NICK
+
+        Every command reply also defines set of status message that it
+        may return inside the <Status Payload>.  All status messages
+        are defined in the section 5.3 SILC Command Status Types.
+
+
+5.2 SILC Commands List
+
+   This section lists all SILC commands, however, it is expected that a
+   implementation and especially client implementation has many more
+   commands that has only local affect.  These commands are official
+   SILC commands that has both client and server sides and cannot be
+   characterized as local commands.
+
+   List of all defined commands in SILC follows.
+
+   0    SILC_COMMAND_NONE
+
+        None.  This is reserved command and must not be sent.
+
+
+   2    SILC_COMMAND_WHOIS
+
+        Max Arguments:  2
+            Arguments:  (1) <nickname>[@<server>]  (2) [<count>]
+
+        Whois.  Whois command is used to query various information about
+
+
+
+Riikonen                                                       [Page 31]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        specific user.  The user maybe requested by their nickname and
+        server name.  The query may find multiple matching users as
+        there are no unique nicknames in the SILC.  The <count> option
+        maybe given to narrow down the number of accepted results.  If
+        this is not defined there are no limit of accepted results.
+        The query may also be narrowed down by defining the server name
+        of the nickname.
+
+        To prevent miss-use of this service wildcards in the nickname
+        or in the servername are not permitted.  It is not allowed
+        to request all users on some server.  The WHOIS requests must
+        be based on specific nickname request.
+
+        The WHOIS request must be always forwarded to router by server
+        so that all users are searched.  However, the server still must
+        search its locally connected clients.  The server must send
+        this command to the server who owns the requested client.  That
+        server must reply to the command.
+
+        Reply messages to the command:
+
+        Max Arguments:  7
+            Arguments:  (1) <Status Payload>       (2) <Client ID>
+                        (3) <nickname>[@<server>]  (4) <username@host>
+                        (5) <real name>            (6) [<channel list>]
+                        (7) [<idle time>]
+
+        This command may reply with several command reply messages to
+        form a list of results.  In this case the status payload will
+        include STATUS_LIST_START status in the first reply and
+        STATUS_LIST_END in the last reply to indicate the end of the
+        list.  If there are only one reply the status is set to normal
+        STATUS_OK.
+
+        The command replies include the Client ID of the nickname,
+        nickname and servername, username and hostnamea and users real
+        name.  Client should process these replies only after the last
+        reply has been received with the STATUS_LIST_END status.  If the
+        <count> option were defined in the query there will be only
+        <count> many replies from the server.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_LIST_START
+            SILC_STATUS_LIST_END
+            SILC_STATUS_ERR_NO_SUCH_NICK
+            SILC_STATUS_ERR_WILDCARDS
+
+
+
+Riikonen                                                       [Page 32]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+
+
+   3    SILC_COMMAND_WHOWAS
+
+        Max Arguments:  2
+            Arguments:  (1) <nickname>[@<server>]  (2) [<count>]
+
+        Whowas.  This command is used to query history information about
+        specific user.  The user maybe requested by their nickname and
+        server name.  The query may find multiple matching users as there
+        are no unique nicknames in the SILC.  The <count> option maybe
+        given to narrow down the number of accepted results.  If this
+        is not defined there are no limit of accepted results.  The query
+        may also be narrowed down by defining the server name of the
+        nickname.
+
+        To prevent miss-use of this service wildcards in the nickname
+        or in the servername are not permitted.  The WHOWAS requests must
+        be based on specific nickname request.
+
+        The WHOWAS request must be always forwarded to router by server
+        so that all users are searched.  However, the server still must
+        search its locally connected clients.
+
+        Reply messages to the command:
+
+        Max Arguments:  3
+            Arguments:  (1) <Status Payload>  (2) <nickname>[@<server>]
+                        (3) <username@host>
+
+        This command may reply with several command reply messages to form
+        a list of results.  In this case the status payload will include
+        STATUS_LIST_START status in the first reply and STATUS_LIST_END in
+        the last reply to indicate the end of the list.  If there are only
+        one reply the status is set to normal STATUS_OK.
+
+        The command replies with nickname and username and hostname.
+        Every server must keep history for some period of time of its
+        locally connected clients.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_LIST_START
+            SILC_STATUS_LIST_END
+            SILC_STATUS_ERR_NO_SUCH_NICK
+
+
+
+Riikonen                                                       [Page 33]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+            SILC_STATUS_ERR_WILDCARDS
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+
+
+   4    SILC_COMMAND_IDENTIFY
+
+        Max Arguments:  2
+            Arguments:  (1) <nickname>[@<server>]  (2) [<count>]
+
+        Identify.  Identify command is almost analogous to WHOIS command,
+        except that it does not return as much information.  Only relevant
+        information such as Client ID is returned.  This is usually used
+        to get the Client ID of a client used in the communication with
+        the client.
+
+        The query may find multiple matching users as there are no unique
+        nicknames in the SILC.  The <count> option maybe given to narrow
+        down the number of accepted results.  If this is not defined there
+        are no limit of accepted results.  The query may also be narrowed
+        down by defining the server name of the nickname.
+
+        To prevent miss-use of this service wildcards in the nickname
+        or in the servername are not permitted.  It is not allowed
+        to request all users on some server.  The IDENTIFY requests must
+        be based on specific nickname request.
+
+        Implementations may not want to give interface access to this
+        commands as it is hardly a command that would be used a end user.
+        However, it must be implemented as it is used with private message
+        sending.
+
+        The IDENTIFY must be always forwarded to router by server so that
+        all users are searched.  However, server must still search its
+        locally connected clients.
+
+        Reply messages to the command:
+
+        Max Arguments:  4
+            Arguments:  (1) <Status Payload>         (2) <Client ID>
+                        (3) [<nickname>[@<server>]]  (4) [<username@host>]
+
+        This command may reply with several command reply messages to form
+        a list of results.  In this case the status payload will include
+        STATUS_LIST_START status in the first reply and STATUS_LIST_END in
+        the last reply to indicate the end of the list.  If there are only
+        one reply the status is set to normal STATUS_OK.
+
+
+
+
+Riikonen                                                       [Page 34]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        The command replies with Client ID of the nickname and if more
+        information is available it may reply with nickname and username
+        and hostname.  If the <count> option were defined in the query
+        there will be only <count> many replies from the server.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_LIST_START
+            SILC_STATUS_LIST_END
+            SILC_STATUS_ERR_NO_SUCH_NICK
+            SILC_STATUS_ERR_WILDCARDS
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+
+
+   5    SILC_COMMAND_NICK
+
+        Max Arguments:  1
+            Arguments:  (1) <nickname>
+
+        Set/change nickname.  This command is used to set nickname for
+        user.  There is no limit of the length of the nickname in SILC.
+        Nickname must not include any spaces (` '), non-printable
+        characters, commas (`,') and any wildcard characters.  Note:
+        nicknames in SILC are case-sensitive which must be taken into
+        account when searching clients by nickname.
+
+        Reply messages to the command:
+
+        Max Arguments:  2
+            Arguments:  (1) <Status Payload>  (2) <New ID Payload>
+
+        This command is replied always with New ID Payload that is
+        generated by the server every time user changes their nickname.
+        Client receiving this payload must start using the received
+        Client ID as its current valid Client ID.  The New ID Payload
+        is described in [SILC2].
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_WILDCARDS
+            SILC_STATUS_ERR_NICKNAME_IN_USE
+            SILC_STATUS_ERR_BAD_NICKNAME
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+
+
+
+Riikonen                                                       [Page 35]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   6    SILC_COMMAND_LIST
+
+        Max Arguments:  2
+            Arguments:  (1) [<Channel ID>] [<server>]
+
+        The list command is used to list channels and their topics on
+        current server.  If the <Channel ID> parameter is used, only the
+        status of that channel is displayed.  Secret channels are not
+        listed at all.  Private channels are listed with status indicating
+        that the channel is private.
+
+        If the <server> argument is specified the specified server's
+        channels are listed.  In this case the command must be sent to
+        the server who owns the channel that was requested.
+
+        Reply messages to the command:
+
+        Max Arguments:  3
+            Arguments:  (1) <Status Payload>  (2) <channel>
+                        (3) <topic>
+
+        This command may reply with several command reply messages to form
+        a list of results.  In this case the status payload will include
+        STATUS_LIST_START status in the first reply and STATUS_LIST_END in
+        the last reply to indicate the end of the list.  If there are only
+        one reply the status is set to normal STATUS_OK.
+
+        This command replies with channel name and the topic of the
+        channel.  If the channel is private channel the <topic> includes
+        "*private*" string.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_LIST_START
+            SILC_STATUS_LIST_END
+            SILC_STATUS_ERR_WILDCARDS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NO_SUCH_CHANNEL
+            SILC_STATUS_ERR_NO_SUCH_CHANNEL_ID
+            SILC_STATUS_ERR_NO_SUCH_SERVER
+
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 36]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   7    SILC_COMMAND_TOPIC
+
+        Max Arguments:  2
+            Arguments:  (1) <Channel ID>  (2) [<server>]]
+
+        This command is used to change or view the topic of a channel.
+        The topic for channel <Channel ID> is returned if there is no
+        <topic> given.  If the <topic> parameter is present, the topic
+        for that channel will be changed, if the channel modes permit
+        this action.
+
+        Reply messages to the command:
+
+        Max Arguments:  2
+            Arguments:  (1) <Status Payload>  (2) [<topic>]
+
+        The command may reply with the topic of the channel if it is
+        set.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_ON_CHANNEL
+            SILC_STATUS_ERR_WILDCARDS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_NO_SUCH_CHANNEL
+            SILC_STATUS_ERR_NO_SUCH_CHANNEL_ID
+            SILC_STATUS_ERR_NO_CHANNEL_ID
+            SILC_STATUS_ERR_BAD_CHANNEL_ID
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NO_CHANNEL_PRIV
+
+
+   8    SILC_COMMAND_INVITE
+
+        Max Arguments:  2
+            Arguments:  (1) <Client ID>  (2) <channel>
+
+        This command is used to invite other clients to join to the
+        channel.  There is no requirement that the channel the target
+        client is being invited to must exist or be a valid channel.
+        The <Client ID> argument is the target client's ID that is being
+        invited.
+
+        Reply messages to the command:
+
+
+
+
+
+Riikonen                                                       [Page 37]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        Max Arguments:  2
+            Arguments:  (1) <Status Payload>
+
+        This command replies only with Status Payload.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_ON_CHANNEL
+            SILC_STATUS_ERR_WILDCARDS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_NO_SUCH_CLIENT_ID
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NO_RECIPIENT
+            SILC_STATUS_ERR_USER_ON_CHANNEL
+            SILC_STATUS_ERR_NO_CLIENT_ID
+
+
+   9    SILC_COMMAND_QUIT
+
+        Max Arguments:  1
+            Arguments:  (1) [<quit message>]
+
+        This command is used by client to end SILC session.  The server
+        must close the connection to a client which sends this command.
+        if <quit message> is given it will be sent to other clients on
+        channel if the client is on channel when quitting.
+
+        Reply messages to the command:
+
+        This command does not reply anything.
+
+
+   10   SILC_COMMAND_KILL
+
+        Max Arguments:  2
+            Arguments:  (1) <Client ID>  (2) [<comment>]
+
+        This command is used by SILC operators to remove a client from
+        SILC network.  The removing has temporary effects and client may
+        reconnect to SILC network.  The <Client ID> is the client to be
+        removed from SILC.  The <comment> argument may be provided to
+        give to the removed client some information why it was removed
+        from the network.
+
+        Reply messages to the command:
+
+
+
+
+Riikonen                                                       [Page 38]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        Max Arguments:  1
+            Arguments:  (1) <Status Payload>
+
+        This command replies only with Status Payload.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_WILDCARDS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NO_SUCH_CLIENT_ID
+            SILC_STATUS_ERR_NO_CLIENT_ID
+
+
+   11   SILC_COMMAND_INFO
+
+        Max Arguments:  1
+            Arguments:  (1) [<server>]
+
+        This command is used to fetch various information about a server.
+        If <server> argument is specified the command must be sent to
+        the requested server.
+
+        Reply messages to the command:
+
+        Max Arguments:  3
+            Arguments:  (1) <Status Payload>  (2) <Server ID>
+                        (3) <string>
+
+        This command replies with the Server ID of the server and a
+        string which tells the information about the server.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_WILDCARDS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NO_SUCH_SERVER_ID
+            SILC_STATUS_ERR_NO_SUCH_SERVER
+
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 39]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   12   SILC_COMMAND_CONNECT
+
+        Max Arguments:  2
+            Arguments:  (1) <Server ID>
+                        (2) [<remote server/router>[:<port>]]
+
+        This command is used by operators to force a server to try to
+        establish a new connection to another router (if the connecting
+        server is normal server) or server (if the conneceting server is
+        router server).  Operator may specify the server/router to be
+        connected by setting <remote server> argument.
+
+        Reply messages to the command:
+
+        Max Arguments:  1
+            Arguments:  (1) <Status Payload>
+
+        This command replies only with Status Payload.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_WILDCARDS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NO_SUCH_SERVER_ID
+            SILC_STATUS_ERR_NO_SERVER_PRIV
+            SILC_STATUS_ERR_NO_ROUTER_PRIV
+
+
+   13   SILC_COMMAND_PING
+
+        Max Arguments:  1
+            Arguments:  (1) <Server ID>
+
+        This command is used by clients to test the communication
+        channel to its server if client suspects that the communication
+        is not working correctly.  The <Server ID> is the ID of the
+        server the client is connected to.
+
+        Reply messages to the command:
+
+        Max Arguments:  1
+            Arguments:  (1) <Status Payload>
+
+        This command replies only with Status Payload.  Server returns
+        SILC_STATUS_OK in Status Payload if pinging was successful.
+
+
+
+Riikonen                                                       [Page 40]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NO_SUCH_SERVER_ID
+            SILC_STATUS_ERR_NOT_REGISTERED
+
+
+   14   SILC_COMMAND_OPER
+
+        Max Arguments:  2
+            Arguments:  (1) <username>  (2) <authentication data>
+
+        This command is used by normal client to obtain server operator
+        privileges on some server or router.  Note that router operator
+        has router privileges that supersedes the server operator
+        privileges and this does not obtain those privileges.  Client
+        must use SILCOPER command to obtain router level privileges.
+
+        The <username> is the username set in the server configurations
+        as operator.  The <authentication data> is the data that the
+        client is authenticated against.  It may be passphrase prompted
+        for user on client's screen or it may be public key
+        authentication data (data signed with private key), or
+        certificate.
+
+        Reply messages to the command:
+
+        Max Arguments:  1
+            Arguments:  (1) <Status Payload>
+
+        This command replies only with Status Payload.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_BAD_PASSWORD
+            SILC_STATUS_ERR_AUTH_FAILED
+
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 41]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   15   SILC_COMMAND_JOIN
+
+        Max Arguments:  3
+            Arguments:  (1) <channel>  (2) [<passphrase>]
+                        (3) [<cipher>]
+
+        Join to channel/create new channel.  This command is used to
+        join to a channel.  If the channel does not exist the channel is
+        created on the server receiving the join request.  The channel
+        may be protected with passphrase.  If this is the case the
+        passphrase must be sent along the join command.
+
+        The name of the <channel> must not include any spaces (` '),
+        non-printable characters, commas (`,') or any wildcard characters.
+
+        Cipher to be used to secure the traffic on the channel may be
+        requested by sending the name of the requested <cipher>.  This
+        is used only if the channel does not exist and is created.  If
+        the channel already exists the cipher set previously for the
+        channel will be used to secure the traffic.
+
+        The server must check whether the user is allowed to join to
+        the requested channel.  Various modes set to the channel affect
+        the ability of the user to join the channel.  These conditions
+        are:
+
+            o  The user must be invited to the channel if the channel
+               is invite-only channel.
+
+            o  The Client ID/nickname/username/hostname must not match
+               any active bans.
+
+            o  The correct passphrase must be provided if passphrase
+               is set to the channel.
+
+            o  The user count limit, if set, must not be reached.
+
+        Reply messages to the command:
+
+        Max Arguments:  5
+            Arguments:  (1) <Status Payload>  (2) <channel>
+                        (3) <Channel ID>      (4) <channel mode mask>
+                        (5) [<topic>]
+
+        This command replies with the channel name requested by the
+        client, channel ID of the channel and topic of the channel
+        if it exists.  It also replies with the channel mode mask
+        which tells all the modes set on the channel.  If the
+
+
+
+Riikonen                                                       [Page 42]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        channel is created the mode mask is zero (0).
+
+        Client must not start transmitting to the channel even after
+        server has replied to this command.  Client is permitted to
+        start transmitting on channel after server has sent packet
+        SILC_PACKET_CHANNEL_KEY to the client.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_WILDCARDS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_BAD_PASSWORD
+            SILC_STATUS_ERR_CHANNEL_IS_FULL
+            SILC_STATUS_ERR_NOT_INVITED
+            SILC_STATUS_ERR_BANNED_FROM_CHANNEL
+            SILC_STATUS_ERR_BAD_CHANNEL
+            SILC_STATUS_ERR_USER_ON_CHANNEL
+
+
+   16   SILC_COMMAND_MOTD
+
+        Max Arguments:  1
+            Arguments:  (1) <server>
+
+        This command is used to query the Message of the Day of a server.
+
+        Reply messages to the command:
+
+        Max Arguments:  2
+            Arguments:  (1) <Status Payload>  (2) [<motd>]
+
+        This command replies with the motd message if it exists.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NO_SUCH_SERVER
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 43]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   17   SILC_COMMAND_UMODE
+
+        Max Arguments:  2
+            Arguments:  (1) <Client ID>  (2) <client mode mask>
+
+        This command is used by client to set/unset modes for itself.
+        However, there are some modes that the client may not set itself,
+        but they will be set by server.  However, client may unset any
+        mode.  Modes may be masked together ORing them thus having
+        several modes set.  Client must keep its client mode mask
+        locally so that the mode setting/unsetting would work without
+        problems.  Client may change only its own modes.
+
+        Following client modes are defined:
+
+           0x0000    SILC_UMODE_NONE
+
+              No specific mode for client.  This is the initial
+              setting when new client is created.  The client is
+              normal client now.
+
+
+           0x0001    SILC_UMODE_SERVER_OPERATOR
+
+              Marks the user as server operator.  Client cannot
+              set this mode itself.  Server sets this mode to the
+              client when client attains the server operator
+              privileges by SILC_COMMAND_OPER command.  Client
+              may unset the mode itself.
+
+
+           0x0002    SILC_UMODE_ROUTER_OPERATOR
+
+              Marks the user as router (SILC) operator.  Client
+              cannot this mode itself.  Router sets this mode to
+              the client when client attains the router operator
+              privileges by SILC_COMMAND_SILCOPER command.  Client
+              may unset the mode itself.
+
+        Reply messages to the command:
+
+        Max Arguments:  2
+            Arguments:  (1) <Status Payload>  (2) <client mode mask>
+
+        This command replies with the changed client mode mask that
+        the client is required to keep locally.
+
+
+
+
+
+Riikonen                                                       [Page 44]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NO_SUCH_CLIENT_ID
+            SILC_STATUS_ERR_BAD_CLIENT_ID
+            SILC_STATUS_ERR_NOT_YOU
+            SILC_STATUS_ERR_UNKNOWN_MODE
+            SILC_STATUS_ERR_NO_RECIPIENT
+            SILC_STATUS_ERR_NO_CLIENT_ID
+
+
+   18   SILC_COMMAND_CMODE
+
+        Max Arguments:  6
+            Arguments:  (1) <Channel ID>    (2) <channel mode mask>
+                        (3) [<user limit>]  (4) [<passphrase>]
+                        (5) [<Client ID>]   (6) [<cipher>[:<key len>]]
+
+        This command is used by client to set or change channel flags on
+        a channel.  Channel has several modes that set various properties
+        of a channel.  Modes may be masked together by ORing them thus
+        having several modes set.  The <Channel ID> is the ID of the
+        target channel.  The client changing channel mode must be on
+        the same channel and poses sufficient privileges to be able to
+        change the mode.
+
+        Following channel modes are defined:
+
+           0x0000    SILC_CMODE_NONE
+
+              No specific mode on channel.  This is the default when
+              channel is created.  This means that channel is just plain
+              normal channel.
+
+
+           0x0001    SILC_CMODE_PRIVATE
+
+              Channel is private channel.  Private channels are shown
+              in the channel list listed with SILC_COMMAND_LIST command
+              with indicatioin that the channel is private.  Also,
+              client on private channel will no be detected to be on
+              the channel as the channel is not shown in the client's
+              currently joined channel list.  Channel founder and
+              channel operator may set/unset this mode.
+
+
+
+
+Riikonen                                                       [Page 45]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+              Typical implementation would use [+|-]p on user interface
+              to set/unset this mode.
+
+
+           0x0002    SILC_CMODE_SECRET
+
+              Channel is secret channel.  Secret channels are not shown
+              in the list listed with SILC_COMMAND_LIST command.  Secret
+              channels can be considered to be invisible channels.
+              Channel founder and channel operator may set/unset this
+              mode.
+
+              Typical implementation would use [+|-]s on user interface
+              to set/unset this mode.
+
+
+           0x0004    SILC_CMODE_PRIVKEY
+
+              Channel uses private channel key to protect the traffic
+              on the channel.  When this mode is set the client will be
+              responsible to set the key it wants to use to encrypt and
+              decrypt the traffic on channel.  Server generated channel
+              keys are not used at all.  This mode provides additional
+              security as clients on channel may agree to use private
+              channel key that even servers do not know.  Naturally,
+              this requires that every client on the channel knows
+              the key before hand (it is considered to be pre-shared-
+              key).  This specification does not define how the private
+              channel key is set as it is entirely local setting on
+              client end.
+
+              As it is local setting it is possible to have several
+              private channel keys on one channel.  In this case several
+              clients can talk on same channel but only those clients
+              that share the key with the message sender will be able
+              to hear the talking.  Client should not display those
+              message for the end user that it is not able to decrypt
+              when this mode is set.
+
+              Only channel founder may set/unset this mode.  If this
+              mode is unset the server will distribute new channel
+              key to all clients on the channel which will be used
+              thereafter.
+
+              Typical implementation would use [+|-]k on user interface
+              to set/unset this mode.
+
+
+
+
+
+Riikonen                                                       [Page 46]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+           0x0008    SILC_CMODE_INVITE
+
+              Channel is invite only channel.  Client may join to this
+              channel only if it is invited to the channel.  Channel
+              founder and channel operator may set/unset this mode.
+
+              Typical implementation would use [+|-]i on user interface
+              to set/unset this mode.
+
+
+           0x0010    SILC_CMODE_TOPIC
+
+              The topic of the channel may only be set by client that
+              is channel founder or channel operator.  Normal clients
+              on channel will not be able to set topic when this mode
+              is set.  Channel founder and channel operator may set/
+              unset this mode.
+
+              Typical implementation would use [+|-]t on user interface
+              to set/unset this mode.
+
+
+           0x0020    SILC_CMODE_ULIMIT
+
+              User limit has been set to the channel.  New clients
+              may not join to the channel when the limit set is
+              reached.  Channel founder and channel operator may set/
+              unset the limit.  The <user limit> argument is the
+              number of limited users.
+
+              Typical implementation would use [+|-]l on user interface
+              to set/unset this mode.
+
+
+           0x0040    SILC_CMODE_PASSPHRASE
+
+              Passphrase has been set to the channel.  Client may
+              join to the channel only if it is able to provide the
+              correct passphrase.  Setting passphrases to channel
+              is entirely safe as all commands are protected in the
+              SILC network.  Only channel founder may set/unset
+              the passphrase.  The <passphrase> argument is the
+              set passphrase.
+
+              Typical implementation would use [+|-]a on user interface
+              to set/unset this mode.
+
+
+
+
+
+Riikonen                                                       [Page 47]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+           0x0080    SILC_CMODE_BAN
+
+              Ban mask has been set to the channel.  The ban mask
+              may be used to ban specific clients to join the channel.
+              The <ban mask> argument is the set ban mask.  When
+              unsetting a ban mask the mask must be provided as
+              argument.  Channel founder and channel operator may
+              set/unset this mode.  Channel founder may not be
+              added to the ban list.
+
+              Typical implementation would use [+|-]b on user interface
+              to set/unset this mode.
+
+
+           0x0100    SILC_CMODE_OPERATOR
+
+              Sets channel operator privileges on the channel for a
+              client on the channel.  The <Client ID> argument is the
+              target client on the channel.  Channel founder and
+              channel operator may set/unset (promote/demote) this
+              mode.
+
+              Typical implementation would use [+|-]o on user interface
+              to set/unset this mode.
+
+
+           0x0200    SILC_CMODE_CIPHER
+
+              Sets specific cipher to be used to protect channel
+              traffic.  The <cipher> argument is the requested cipher.
+              When set or unset the server must re-generate new
+              channel key.  If <key len> argument is specified with
+              <cipher> argument the new key is generated of <key len>
+              length.
+
+              Typical implementation would use [+|-]c on user interface
+              to set/unset this mode.
+
+
+        To make the mode system work, client must keep the channel mode
+        mask locally so that the mode setting and unsetting would work
+        without problems.  The client receives the initial channel mode
+        mask when it joins to the channel.  When the mode changes on
+        channel the server distributes the changed channel mode mask to
+        all clients on the channel by sending SILC_COMMAND_CMODE command
+        reply packet.
+
+
+
+
+
+Riikonen                                                       [Page 48]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        Reply messages to the command:
+
+        Max Arguments:  2
+            Arguments:  (1) <Status Payload>  (2) <channel mode mask>
+
+        This command replies with the changed channel mode mask that
+        client is required to keep locally.  The same mask is also
+        sent to all clients on channel by sending additional command
+        reply to them.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NOT_ON_CHANNEL
+            SILC_STATUS_ERR_NO_SUCH_CHANNEL_ID
+            SILC_STATUS_ERR_BAD_CHANNEL_ID
+            SILC_STATUS_ERR_NO_CHANNEL_ID
+            SILC_STATUS_ERR_NO_CHANNEL_PRIV
+            SILC_STATUS_ERR_UNKNOWN_MODE
+            SILC_STATUS_ERR_NO_CLIENT_ID
+
+
+   19   SILC_COMMAND_KICK
+
+        Max Arguments:  3
+            Arguments:  (1) <channel>  (2) <Client ID>
+                        (3) [<comment>]
+
+        This command is used by channel operators to remove a client from
+        channel.  The <channel> argument is the channel the client to be
+        removed is on currently.  Note that the "kicker" must be on the same
+        channel.  If <comment> is provided it will be sent to the removed
+        client.
+
+        Reply messages to the command:
+
+        Max Arguments:  1
+            Arguments:  (1) <Status Payload>
+
+        This command replies only with Status Payload.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+
+
+
+Riikonen                                                       [Page 49]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NO_SUCH_CHANNEL
+            SILC_STATUS_ERR_NO_SUCH_CLIENT_ID
+            SILC_STATUS_ERR_NO_CHANNEL_PRIV
+            SILC_STATUS_ERR_NO_CLIENT_ID
+
+
+   20   SILC_COMMAND_RESTART
+
+        Max Arguments:  0
+            Arguments:  None
+
+        This command may only be used by server operator to force a
+        server to restart itself.
+
+        Reply messages to the command:
+
+        Max Arguments:  1
+            Arguments:  (1) <Status Payload>
+
+        This command replies only with Status Payload.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NO_SERVER_PRIV
+
+
+   21   SILC_COMMAND_CLOSE
+
+        Max Arguments:  1
+            Arguments:  (1) <Server ID>
+
+        This command is used only by operator to close connection to a
+        remote site.  The <Server ID> argument is the ID of the remote
+        site and must be valid.
+
+        Reply messages to the command:
+
+        Max Arguments:  1
+            Arguments:  (1) <Status Payload>
+
+        This command replies only with Status Payload.
+
+
+
+
+
+
+Riikonen                                                       [Page 50]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NO_SUCH_SERVER
+            SILC_STATUS_ERR_NO_SERVER_PRIV
+            SILC_STATUS_ERR_NO_SUCH_SERVER_ID
+
+
+   22   SILC_COMMAND_DIE
+
+        Max Arguments:  0
+            Arguments:  None
+
+        This command is used only by operator to shutdown the server.
+        All connections to the server will be closed and the server is
+        shutdown.
+
+        Reply messages to the command:
+
+        Max Arguments:  1
+            Arguments:  (1) <Status Payload>
+
+        This command replies only with Status Payload.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NO_SERVER_PRIV
+
+
+   23   SILC_COMMAND_SILCOPER
+
+        Max Arguments:  2
+            Arguments:  (1) <username>  (2) <authentication data>
+
+        This command is used by normal client to obtain router operator
+        privileges (also known as SILC operator) on some router.  Note
+        that router operator has router privileges that supersedes the
+        server operator privileges.
+
+        The <username> is the username set in the server configurations
+        as operator.  The <authentication data> is the data that the
+        client is authenticated against.  It may be passphrase prompted
+        for user on client's screen or it may be public key
+
+
+
+Riikonen                                                       [Page 51]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+        authentication data (data signed with private key), or
+        certificate.
+
+        Difference between router operator and server operator is that
+        router operator is able to handle cell level properties while
+        server operator (even on router server) is able to handle only
+        local properties, such as, local connections and normal server
+        administration.
+
+        Reply messages to the command:
+
+        Max Arguments:  1
+            Arguments:  (1) <Status Payload>
+
+        This command replies only with Status Payload.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_BAD_PASSWORD
+            SILC_STATUS_ERR_AUTH_FAILED
+
+
+   24   SILC_COMMAND_LEAVE
+
+        Max Arguments:  1
+            Arguments:  (1) <Channel ID>
+
+        This command is used by client to leave a channel the client is
+        joined to.  After a client has leaved the channel the server
+        must create new key for the channel and distribute to all clients
+        still currently on the channel.
+
+        Reply messages to the command:
+
+        Max Arguments:  1
+            Arguments:  (1) <Status Payload>
+
+        This command replies only with Status Payload.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+
+
+
+Riikonen                                                       [Page 52]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NO_SUCH_CHANNEL_ID
+            SILC_STATUS_ERR_BAD_CHANNEL_ID
+            SILC_STATUS_ERR_NO_CHANNEL_ID
+
+
+   25   SILC_COMMAND_NAMES
+
+        Max Arguments:  1
+            Arguments:  (1) <Channel ID>
+
+        This command is used to list user names currently on the requested
+        channel; argument <Channel ID>.  The server must resolve the
+        user names and send a comma (`,') separated list of user names
+        on the channel.  Server or router may resolve the names by sending
+        SILC_COMMAND_WHOIS commands.
+
+        If the requested channel is a private or secret channel, this
+        command must not send the list of users, as private and secret
+        channels cannot be seen by outside.  In this case the returned
+        name list may include a indication that the server could not
+        resolve the names of the users on the channel.
+
+        Reply messages to the command:
+
+        Max Arguments:  2
+            Arguments:  (1) <Status Payload>  (2) <name list>
+
+        This command replies with the comma separated list of users on
+        the channel.
+
+        Status messages:
+
+            SILC_STATUS_OK
+            SILC_STATUS_ERR_NOT_REGISTERED
+            SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+            SILC_STATUS_ERR_TOO_MANY_PARAMS
+            SILC_STATUS_ERR_NO_SUCH_CHANNEL_ID
+            SILC_STATUS_ERR_BAD_CHANNEL_ID
+            SILC_STATUS_ERR_NO_CHANNEL_ID
+            SILC_STATUS_ERR_NOT_ON_CHANNEL
+
+
+   26 - 254
+
+        Currently undefined commands.
+
+
+
+
+
+Riikonen                                                       [Page 53]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   255  SILC_COMMAND_MAX
+
+        Reserved command.  This must not be sent.
+
+
+5.3 SILC Command Status Types
+
+5.3.1 SILC Command Status Payload
+
+   Command Status Payload is sent in command reply messages to indicate
+   the status of the command.  The payload is one of argument in the
+   command thus this is the data area in Command Argument Payload described
+   in [SILC2].  The payload is only 2 bytes of length.  Following diagram
+   represents the Command Status Payload (field is always in MSB order).
+
+
+                                          1
+                      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+                     |        Status Message         |
+                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                  Figure 5:  SILC Command Status Payload
+
+
+      o Status Message (2 bytes) - Indicates the status message.
+        All Status messages are described in the next section.
+
+
+5.3.2 SILC Command Status List
+
+   Command Status messages are returned in the command reply messages
+   to indicate whether the command were executed without errors.  If error
+   has occured the status tells which error occured.  Status payload only
+   sends numeric reply about the status.  Receiver of the payload must
+   convert the numeric values into human readable error messages.  The
+   list of status messages below has an example human readable error
+   messages that client may display for the user.
+
+   List of all defined command status messages following.
+
+   Generic status messages:
+
+   0    SILC_STATUS_OK
+
+        Ok status.  Everything went Ok.  The status payload maybe
+        safely ignored in this case.
+
+
+
+
+Riikonen                                                       [Page 54]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   1    SILC_STATUS_LIST_START
+
+        Start of the list.  There will be several command replies and
+        this reply is the start of the list.
+
+   2    SILC_STATUS_LIST_END
+
+        End of the list.  There were several command replies and this
+        reply is the last of the list.  There won't be other replies
+        beloning to this list after this one.
+
+   3 - 9
+
+        Currently undefined and has been reserved for the future.
+
+
+   Error status message:
+
+   10   SILC_STATUS_ERR_NO_SUCH_NICK
+
+        "No such nickname".  Requested nickname does not exist.
+
+   11   SILC_STATUS_ERR_NO_SUCH_CHANNEL
+
+        "No such channel".  Requested channel name does not exist.
+
+   12   SILC_STATUS_ERR_NO_SUCH_SERVER
+
+        "No such server".  Requested server name does not exist.
+
+   13   SILC_STATUS_ERR_TOO_MANY_TARGETS
+
+        "Duplicate recipients. No message delivered".  Message were
+        tried to be sent to recipient which has several occurrences in
+        the recipient list.
+
+   14   SILC_STATUS_ERR_NO_RECIPIENT
+
+        "No recipient given".  Command required recipient which was
+        not provided.
+
+   15   SILC_STATUS_ERR_UNKNOWN_COMMAND
+
+        "Unknown command".  Command sent to server is unknown by the
+        server.
+
+
+
+
+
+
+Riikonen                                                       [Page 55]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   16   SILC_STATUS_ERR_WILDCARDS
+
+        "Wildcards cannot be used".  Wildcards were provided but they
+        weren't permitted.
+
+   17   SILC_STATUS_ERR_NO_CLIENT_ID
+
+        "No Client ID given".  Client ID were expected as command
+        parameter but were not found.
+
+   18   SILC_STATUS_ERR_NO_CHANNEL_ID
+
+        "No Channel ID given".  Channel ID were expected as command
+        parameter but were not found.
+
+   19   SILC_STATUS_ERR_BAD_CLIENT_ID
+
+        "Bad Client ID".  Client ID provided were erroneous.
+
+   20   SILC_STATUS_ERR_BAD_CHANNEL_ID
+
+        "Bad Channel ID".  Channel ID provided were erroneous.
+
+   21   SILC_STATUS_ERR_NO_SUCH_CLIENT_ID
+
+        "No such Client ID".  Client ID provided does not exist.
+
+
+   22   SILC_STATUS_ERR_NO_SUCH_CHANNEL_ID
+
+        "No such Channel ID".  Channel ID provided does not exist.
+
+   23   SILC_STATUS_ERR_NICKNAME_IN_USE
+
+        "Nickname already exists".  Nickname created could not be
+        registered because number of same nicknames were already set to
+        maximum.  This is not expected to happen in real life but is
+        possible to occur.
+
+   24   SILC_STATUS_ERR_NOT_ON_CHANNEL
+
+        "You are not on that channel".  The command were specified for
+        client user is not currently on.
+
+   25   SILC_STATUS_ERR_USER_ON_CHANNEL
+
+        "User already on channel".  User were invited on channel they
+        already are on.
+
+
+
+Riikonen                                                       [Page 56]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   26   SILC_STATUS_ERR_NOT_REGISTERED
+
+        "You have not registered".  User executed command that requires
+        the client to be registered on the server before it may be
+        executed.
+
+   27   SILC_STATUS_ERR_NOT_ENOUGH_PARAMS
+
+        "Not enough parameters".  Command requires more parameters
+        than provided.
+
+   28   SILC_STATUS_ERR_TOO_MANY_PARAMS
+
+        "Too many parameters".  Too many parameters were provided
+        for the command.
+
+   29   SILC_STATUS_ERR_PERM_DENIED
+
+        "Your host is not among the privileged".  The client tried to
+        register on server that does not allow this host to connect.
+
+   30   SILC_STATUS_ERR_BANNED_FROM_SERVER
+
+        "You are banned from this server".  The client tried to register
+        on server that has explicitly denied this host to connect.
+
+   31   SILC_STATUS_ERR_BAD_PASSWORD
+
+        "Cannot join channel. Incorrect password".  Password provided for
+        channel were not accepted.
+
+   32   SILC_STATUS_ERR_CHANNEL_IS_FULL
+
+        "Cannot join channel. Channel is full".  The channel is full
+        and client cannot be joined to it.
+
+   33   SILC_STATUS_ERR_NOT_INVITED
+
+        "Cannot join channel. You have not been invited".  The channel
+        is invite only channel and client has not been invited.
+
+   34   SILC_STATUS_ERR_BANNED_FROM_CHANNEL
+
+        "Cannot join channel. You have been banned".  The client has
+        been banned from the channel.
+
+
+
+
+
+
+Riikonen                                                       [Page 57]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+   35   SILC_STATUS_ERR_UNKNOWN_MODE
+
+        "Unknown mode".  Mode provided by the client were unknown to
+        the server.
+
+   36   SILC_STATUS_ERR_NOT_YOU
+
+        "Cannot change mode for other users".  User tried to change
+        someone else's mode.
+
+   37   SILC_STATUS_ERR_NO_CHANNEL_PRIV
+
+        "Permission denied. You are not channel operator".  Command may
+        be executed only by channel operator.
+
+   38   SILC_STATUS_ERR_NO_SERVER_PRIV
+
+        "Permission denied. You are not server operator".  Command may
+        be executed only by server operator.
+
+   39   SILC_STATUS_ERR_NO_ROUTER_PRIV
+
+        "Permission denied. You are not SILC operator".  Command may be
+        executed only by router (SILC) operator.
+
+   40   SILC_STATUS_ERR_BAD_NICKNAME
+
+        "Bad nickname".  Nickname requested contained illegal characters
+        or were malformed.
+
+   41   SILC_STATUS_ERR_BAD_CHANNEL
+
+        "Bad channel name".  Channel requested contained illegal characters
+        or were malformed.
+
+   42   SILC_STATUS_ERR_AUTH_FAILED
+
+        "Authentication failed".  The authentication data sent as
+        argument were wrong and thus authentication failed.
+
+
+6 Security Considerations
+
+   Security is central to the design of this protocol, and these security
+   considerations permeate the specification.
+
+
+
+
+
+
+Riikonen                                                       [Page 58]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+7 References
+
+   [SILC2]      Riikonen, P., "SILC Packet Protocol", Internet Draft,
+                June 2000.
+
+   [SILC3]      Riikonen, P., "SILC Key Exchange and Authentication
+                Protocols", Internet Draft, June 2000.
+
+   [IRC]        Oikarinen, J., and Reed D., "Internet Relay Chat Protocol",
+                RFC 1459, May 1993.
+
+   [SSH-TRANS]  Ylonen, T., et al, "SSH Transport Layer Protocol",
+                Internet Draft.
+
+   [PGP]        Callas, J., et al, "OpenPGP Message Format", RFC 2440,
+                November 1998.
+
+   [SPKI]       Ellison C., et al, "SPKI Certificate Theory", RFC 2693,
+                September 1999.
+
+   [PKIX-Part1] Housley, R., et al, "Internet X.509 Public Key
+                Infrastructure, Certificate and CRL Profile", RFC 2459,
+                January 1999.
+
+   [Schneier]   Schneier, B., "Applied Cryptography Second Edition",
+                John Wiley & Sons, New York, NY, 1996.
+
+   [Menezes]    Menezes, A., et al, "Handbook of Applied Cryptography",
+                CRC Press 1997.
+
+   [OAKLEY]     Orman, H., "The OAKLEY Key Determination Protocol",
+                RFC 2412, November 1998.
+
+   [ISAKMP]     Maughan D., et al, "Internet Security Association and
+                Key Management Protocol (ISAKMP)", RFC 2408, November
+                1998.
+
+   [IKE]        Harkins D., and Carrel D., "The Internet Key Exhange
+                (IKE)", RFC 2409, November 1998.
+
+   [HMAC]       Krawczyk, H., "HMAC: Keyed-Hashing for Message
+                Authentication", RFC 2104, February 1997.
+
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 59]
+\f
+Internet Draft      Secure Internet Live Conferencing       28 June 2000
+
+
+8 Author's Address
+
+   Pekka Riikonen
+   Kasarmikatu 11 A4
+   70110 Kuopio
+   Finland
+
+   EMail: priikone@poseidon.pspt.fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Riikonen                                                       [Page 60]
+\f
\ No newline at end of file
index 426901f38a98d4191ef3bb7b6decdae59e628915..91417cb270c6eb8e56e88a795ca27bfad705eea2 100644 (file)
@@ -1,4 +1,5 @@
 <html>
 <html>
+<style TYPE="text/css"><!-- A:link {text-decoration: none}A:visited{text-decoration:none}A:active{text-decoration:none}--></style>
 <body bgcolor="#ffffff">
 <p><br>
 <a href="index.html"><img src="silc2.jpg" border=0></a>
 <body bgcolor="#ffffff">
 <p><br>
 <a href="index.html"><img src="silc2.jpg" border=0></a>
index ccfe31beeabaa73401f26f82537ea626ec2e542e..2a43ec14e1403c3c2edbbf39e039c92140db64a8 100644 (file)
@@ -1,4 +1,5 @@
 <html>
 <html>
+<style TYPE="text/css"><!-- A:link {text-decoration: none}A:visited{text-decoration:none}A:active{text-decoration:none}--></style>
 <body bgcolor="#ffffff">
 <p><br>
 <a href="index.html"><img src="silc2.jpg" border=0></a>
 <body bgcolor="#ffffff">
 <p><br>
 <a href="index.html"><img src="silc2.jpg" border=0></a>
index 4ce90b3d8a253fc2f6ac90f0d15ba36227058a49..f21171523dfbf0f9f2ab470f1b688245e9d0f9ef 100644 (file)
@@ -17,7 +17,7 @@
   <li><a href="about.html">About the SILC</a>
   <li><a href="history.html">History</a>
   <li><a href="faq.html">The SILC FAQ</a>
   <li><a href="about.html">About the SILC</a>
   <li><a href="history.html">History</a>
   <li><a href="faq.html">The SILC FAQ</a>
-  <li><a href="doc.html">SILC Documentation</a>
+  <li><a href="docs.html">SILC Documentation</a>
   <li><a href="features.html">SILC Features</a>
 </ul>
 </td>
   <li><a href="features.html">SILC Features</a>
 </ul>
 </td>
 <tr><td bgcolor="#EEEEFF">&nbsp;<tr><td>&nbsp;</td></tr>
 <tr><td>
 <div style="margin-left: 20px">
 <tr><td bgcolor="#EEEEFF">&nbsp;<tr><td>&nbsp;</td></tr>
 <tr><td>
 <div style="margin-left: 20px">
-<center><h1>SILC XXXX2000 Development Version Available</h1></center>
+<center><h1>SILC 28062000 Development Version Available</h1></center>
 <center>
 <font size=4>
 <center>
 <font size=4>
-No, it's not available just yet.
+First public release of SILC is finally available.  The Developer's version
+28062000 of SILC is available for testing.  Note that the version is really
+a developer's version and there is no guarantees that this package even
+compiles, and even if it compiles there is no guarantees that it would work,
+and even if it works there is no guarantees that it would work correctly,
+and even if it seems to work correctly it may be just plain luck.
+<p>
+Download: <a href="download.html">SILC 28062000 Development Version</a>
 </center>
 <p><br>
 </center>
 <p><br>
-
 </div>
 </td></tr>
 </div>
 </td></tr>
+
 <tr><td bgcolor="#EEEEFF">&nbsp;<tr><td>&nbsp;</td></tr>
 <tr><td>
 <div style="margin-left: 20px">
 <center><h1>Developers Wanted For SILC Project</h1></center>
 <center>
 <font size=4>
 <tr><td bgcolor="#EEEEFF">&nbsp;<tr><td>&nbsp;</td></tr>
 <tr><td>
 <div style="margin-left: 20px">
 <center><h1>Developers Wanted For SILC Project</h1></center>
 <center>
 <font size=4>
-XXX
+SILC Project needs developers who would like to contribute their time,
+skills and ideas to the project.  SILC still has a long road ahead before
+the first official stable release.  We need C coders,  technical writers
+(to write documentation) and web administrator to take over these web pages.
+Feel free to start narrowing down the TODO list.
+<p>
+If You would like to contribute to SILC project please contact me at:
+<a href="mailto:priikone@poseidon.pspt.fi">priikone@poseidon.pspt.fi</a>
 </center>
 <p><br>
 </div>
 </td></tr>
 </center>
 <p><br>
 </div>
 </td></tr>
+
+<tr><td bgcolor="#EEEEFF">&nbsp;<tr><td>&nbsp;</td></tr>
+<tr><td>
+<div style="margin-left: 20px">
+<center><h1>SILC Project Started</h1></center>
+<center>
+<font size=4>
+The Pressrelease:
+<p>
+Official SILC Project home page: 
+<a href="http://silc.pspt.fi">http://silc.pspt.fi</a>
+<p>
+SILC Development Version is available for download from following addresses:
+<p>
+HTTP: <a href="http://silc.pspt.fi/silc-28062000.tar.gz">
+silc-28062000.tar.gz (1.4 MB)</a>
+<br>
+FTP: <a href="ftp://silc.pspt.fi/pub/silc/snapshots/silc-28062000.tar.gz">
+silc-28062000.tar.gz (1.4 MB)</a>
+<p>
+The SILC protocol specification is available from following addresses:
+<p>
+HTTP: <a href="http://silc.pspt.fi/docs.html/">
+http://silc.pspt.fi/docs.html</a>
+<br>
+FTP: <a href="ftp://silc.pspt.fi/pub/silc/">
+ftp://silc.pspt.fi/pub/silc/</a>
+<p>
+Author's contact information:
+<p>
+Pekka Riikonen <a href="mailto:priikone@poseidon.pspt.fi">
+priikone@poseidon.pspt.fi</a>
+<br>
+Home page: <a href="http://poseidon.pspt.fi/~priikone/">
+http://poseidon.pspt.fi/~priikone/</a>
+<p>
+</center>
+<p><br>
+</div>
+</td></tr>
+
 </table>
 
 <p>
 </table>
 
 <p>
@@ -73,4 +128,4 @@ Last updated: Mon Jun 12 10:44:06 EEST 2000
 </center>
 </font>
 </body>
 </center>
 </font>
 </body>
-</html>
+</html>
\ No newline at end of file
diff --git a/public_html/todo.html b/public_html/todo.html
new file mode 100644 (file)
index 0000000..fb9f238
--- /dev/null
@@ -0,0 +1,388 @@
+<html>
+<style TYPE="text/css"><!-- A:link {text-decoration: none}A:visited{text-decoration:none}A:active{text-decoration:none}--></style>
+<body bgcolor="#ffffff">
+<p><br>
+<a href="index.html"><img src="silc2.jpg" border=0></a>
+<table width="70%" border="0" cellspacing="0" cellpadding="1"
+align=center>
+<tr>
+<td>
+<p>
+<font size=4>
+<h1>TODO</h1>
+<p>
+<pre>
+This is more or less complete list of tasks that has to be done before
+SILC 1.0 could ever be released.  It is clear that the list does not
+include all the bugs that exists.  At the end of list are tasks that 
+needs to be done but are probably post 1.0.
+
+Feel free to contribute if you have the ability and free time - all the
+help is really appreciated - and needed.
+
+                                                       - Pekka
+
+[Latest Note:  The protocol has changed a bit in some parts which 
+causes that the current implementation violates some requirements.
+These are not listed here, currently.]
+
+
+New features TODO
+=================
+
+ o Extended SIM (SILC Module) support.  Currently only SILC Cipher API
+   and SILC Hash API may be used as SIM's.  What I have in mind is to
+   have extended support for SIM's so that basically any SILC API could
+   be used as SIM's.  This would open tremendous possiblities but
+   opens also issues on security that needs to be dealt with.
+
+   Some sort of SIM compilation environment should be defined so that
+   the SIM's could use SILC specific symbols from the modules (which they
+   cannot do currently).  In the future modules could add new features
+   to SILC easily with this support.  I'm more thinking this from client's
+   perspective to add new features to client (such as IRC support as SIM)
+   but server should have the support as well.  Anyhow, this is an 
+   interesting feature...
+
+   This maybe post 1.0 task - dunno.
+
+ o SIM support for other platforms than just for Linux.  Apache has
+   example code (code that we could use directly pretty easily) for
+   other platforms.
+
+ o We should replace all short, int, long, unsigned short, unsigned int,
+   unsigned long with some pre-defined datatypes that really are what
+   we want on all platforms.  int16, uint16, int32, uint32 etc. are
+   what we could use or maybe SilcInt16, SilcUInt16 etc.  Also, boolean
+   datatype should be defined.
+
+ o More platform supports should be added.  The code is pretty much
+   generic but there are some parts that require porting (SIM).  Also, 
+   some support for different platforms is needed into configure.in.
+
+ o SILC requires currently GCC to work because we use GCC specific 
+   compilation options.  Generally any compiler that supports inline
+   functions and can build shared libraries (for SIMs) should work.  
+   These cases should be included into configure.in.
+
+
+TODO In SILC Client
+===================
+
+ o Implement all commands.  A lot of commands are still yet to be
+   implemented.  Most of them are trivial but some will require some
+   planning.  Go see the command.c for unimplemented commands.
+
+ o Non-blocking connection on the background must be stopped if some
+   other connection on same window has established.  Now it is possible
+   that some non-blocking connection timeouts on the background when
+   we already have a working connection to some other place; things
+   goes bad.
+
+ o Finish WHOIS, finish JOIN and other commands that are partly
+   implemented.
+
+ o Input line on UI is buggy.  Cursor movement etc bugs.  Too lazy to
+   fix it.
+
+ o Logic for handling multiple same nicknames for example in private
+   message sending.  I guess the logic is done in server side but is
+   missing from client.
+
+ o Private message key setting is missing and must be implemented.
+   Currently private messages are encrypted with session keys.  This
+   is required by the protocol.
+
+ o Channel private key setting is missing and must be implemented.
+   Currently there cannot be private keys for channels.  Normal channel
+   keys (generated by server) are used.  This is required by the protocol.
+
+ o Public and private key generation is now done everytime the program
+   is run.  Now, this is only for testing period as I've been lazy to
+   do it any better for now.  This must be fixed.
+
+ o I guess, public key authentication (when connecting to a server)
+   is not working currently.  It is just matter of loading the keys
+   from file and using them (see corresponding code in server, it should
+   support public key authentication already).
+
+ o Multiple windows support.  Basic support for multiple windows already
+   exists but a lot is still missing to get it working.  Also, some
+   of the existing stuff probably needs to be tweaked a bit before the
+   multiple windows support could be done.  And of course the actual
+   commands that control the windows needs to be written (/WINDDOW).
+
+ o Implement /KEYMAP (or similiar) command to remap control and function
+   keys.
+
+ o Implement /ALIAS command to make command aliases.
+
+ o Implement /set/if/do/while etc as in IRC2.  Maybe post 1.0 task.
+   Some scripting would be good.
+
+ o Connection Authentication request resolving is missing and must be
+   done.  This is required by the protocol.
+
+ o Key Exchange protocol's responder side is missing from client.  
+   Generally it is possible for the client to be responder so it should
+   be implemented (See corresponding code from server).  Error handling
+   in the KE protocol is also in pretty bad shape in client.
+
+ o Configuration file loading from global and from local dirs.  This
+   is currently missing and I guess the global is only used.  Old SILC
+   version (in 1997) had ~./silc directory that I guess should be done
+   now as well.  The code for handling those exists but not in current
+   source tree.
+
+ o Configuration file format - could be better.
+
+ o Write help files for commands.  Nice format for the help files should
+   be selected.  I'm open for ideas.
+
+ o All allocations and freeing needs to be checked for memory leaks.
+   Also, return values from various allocations and functions needs to
+   checked.
+
+
+TODO In SILC Server
+===================
+
+ o Implement all commands on server side.  A lot of commands are still yet
+   to be implemented.  Most of them are trivial but some will require some
+   planning.  Go see the command.c for unimplemented commands.
+
+ o DNS/IP lookup blocks the server.  This must be fixed.  Check the
+   resolver stuff (resolver(3), resolver(5)).  Either we have to do the
+   own resolver stuff (through scheduler, if possible without writing
+   too much own stuff) or use threads.
+
+ o Lenght of the packet processing timeouts needs to be checked whether
+   they are too short or too long.  I haven't really tested whether they
+   are suitable.  They should be tested on high load which I haven't done
+   at all yet.
+
+ o Public and private key generation is now done everytime the program
+   is run.  Now, this is only for testing period as I've been lazy to
+   do it any better for now.  This must be fixed.
+
+ o Server says that it is able to listen on multiple ports but currently
+   that is bogus.  It can, but internals are for single server.
+
+ o Command lagging must implemented.  Those commands (all currently) that
+   has the LAG flag set they must not be allowed to be executed more than
+   once, say, in 2 seconds.
+
+ o Command flag usage in general is not implemented yet.
+
+ o Client history must be implemented.  Protocol says that server must
+   keep history information about clients for some period of time.
+
+ o Channel flags and user modes on channels are not implemented yet as
+   /MODE command is not implemented yet in client and server.
+
+ o Protocol execution timeouts are hard coded, should be configurable.
+
+ o Channel message sending routines uses a lot of common code.  Should
+   create a common function for those instead of writing the same code
+   again everytime, as done now.
+
+ o serverutil.c I guess should be created for util-like functions that
+   now resides in server.c, which is getting too big.
+
+ o serverconfig.c and the function naming in it is inconsistent.  It is 
+   not silc_config_server* it should be silc_server_config*.  As should
+   all the SilcConfigServer* types be SilcServerConfig*.
+
+ o Implement DENY_CONNECTION section in serverconfig.c and in server.
+
+ o Implement REDIRECT_CLIENT section in serverconfig.c and in server.
+
+ o Configuration file format - could be better.
+
+ o IP address fields in configuration file should accept mask format
+   as well, IP/MASK, and not just plain IP.
+
+ o Connection classes should be actually implemented in serverconfig.c.
+   They can be defined but they are totally ignored currently.
+
+ o Acceptance of incoming connections (client and server connections)
+   should be checked before key exchange protocol.  Currently it is
+   checked at the authentication phase after KE, that is ok, but it should
+   be checked before starting KE, as well.
+
+ o Statistics are totally missing from the server.  It would be nice
+   to gather some statistics.
+
+ o All allocations and freeing needs to be checked for memory leaks.
+   Also, return values from various allocations and functions needs to
+   checked.
+
+
+TODO In SILC Libraries
+======================
+
+ o Public key verification in SKE (SILC Key Exchange) protocol is missing,
+   thus currently we trust on all public keys.  This probably doesn't cause
+   bad problems but the mechanism of verifying it from local database
+   (from files) needs to be done (it can open man-in-the-middle-attacks).
+
+ o Implement PFS (Perfect Forward Secrecy) flag in SKE (and in client and
+   server, actually).  If PFS is set, re-key must cause new key exchange.
+   This is required by the SILC protocol.
+
+ o Re-key in general is actually missing (from everywhere) and must be done.
+
+ o SKE does not send correct status types.  Types are defined but not
+   sent.
+
+ o Connection authentication protocol does not send correct status types.
+   These types are not defined currently at all.
+
+ o PKCS#1 style RSA public key encryption/decryption/sign/verify is 
+   missing, and should be added for interoperability reasons.  The thing 
+   I've done now is bad and should be removed as soon as possible (or 
+   the protocol should then state the method of how they should be done).
+
+ o SILC public key file type is bad.  I'd like to see PEM encoded files.
+   I have public domain code for base64 encoding but it needs to be 
+   rewritten.
+
+ o Slow ciphers should be removed.  I think we don't need more than
+   the AES finalists plus blowfish and RC5.
+
+ o These slow ciphers actually don't work currently as I've tested
+   only the ones that are worth testing.  The CBC mode on these slow
+   ciphers probably don't work.  No need to worry, these ciphers should
+   be removed.
+
+ o Scheduler needs to be analyzed on high load as it might be unfair
+   towards select() because it may run timeout tasks before select() and
+   after select().  If it is found to be unfair the timeout task running
+   before select() should probably be removed.
+
+ o On select() issue; maybe we should use poll() instead if it is
+   available? poll() doesn't have max fd limit...
+
+ o SIM support for SILC PKCS API needs to made so that they could be
+   used as SIM's.  At the same time some work is required on prime
+   generation as the way it is done now sucks.  Read from code for
+   more (silcpkcs.h).
+
+ o Compression routines are missing.  The protocol supports packet
+   compression thus it must be implemented.  SILC Comp API must be
+   defined.  zlib package is already included into the lib dir (in CVS,
+   not in distribution), but it is not used yet, and it requires some
+   tweaking on the Makefiles (we want static lib not shared).
+
+ o Cipher API needs to be made more consistent.  Some parts of the
+   code generated with current Cipher API looks really bad.  Same
+   is with PKCS API, even worse actually.  They need to be made
+   cleaner.  Introducing silc_cipher_encrypt/decrypt/set_key etc.
+   functions (I actually don't understand why have I left these un-done).
+
+ o Scheduler should automatically allocate task queues if NULL pointers 
+   are passed to the silc_schedule_init.  Would make initialization 
+   cleaner.
+
+ o Packet processing routines in client and server are actually pretty
+   much generic and should be moved from the client/server to the library
+   as generic routines (silc_<client/server>_packet_decrypt_rest* etc).
+   This requires heavy changes to the client and server.
+
+ o Random Number Generator needs some tweaking.  Reading /dev/random may
+   block resulting slow initialization of RNG.  Some other things in the
+   RNG may block as well.  Also, I have some pending changes to the RNG 
+   that needs to be commited (from Schneier's Yarrow-160 paper).  They 
+   should make the RNG even better.
+
+ o Logging should be made more generic in a way that application can
+   set to where the logging is destined to.  Now, it is always destined
+   to stdout (or stderr) which is a bad thing for client.  Ie. some
+   sort of logging registration functions or similiar should be done
+   (silclog.[ch] in core).  The actual output of logs should be done
+   by callback function in the application not in lib.
+
+ o I don't like the ID cache system currenly implemented.  Ugly and
+   not so good.  Must be rewritten very soon.
+
+ o All allocations and freeing needs to be checked for memory leaks.
+
+ o There are also checks missing from allocations whether the allocation
+   returns valid memory or NULL.  These are missing in library as well
+   in client and server.  Either all checks has to be added or we will
+   have to make sure that silc_*alloc()s always return valid memory
+   and assert()s if the system's memory allocator (*alloc()) fails.
+
+ o silc_buffer_[un]format() needs to be made more stable as it may
+   crash the SILC if malformed data is sent as argument.  There are a
+   lot of places in client and server where we trust directly data coming
+   from network and try to unformat it.  The unformatting routine needs
+   to be able handle situations where data sent is malformed, by mistake
+   or intentionally.  This is important as it is easy to crash the SILC
+   now by just sending malformed data.  Also, in client and server we
+   must start checking the return value from silc_buffer_[un]format.
+
+
+Other Things TODO
+=================
+
+ o Write manuals for server.
+
+ o Write manuals for client.
+
+ o Write SILC Library Reference manual.  This would include all the SILC
+   API's with simple examples how the functions are to be used.  This is
+   pretty easy to create by taking all the functions plus their comments
+   from source/header files.  However, same sort of reference manual 
+   should be written for client and server as well.
+
+
+TODO After 1.0
+==============
+
+ o Pthreads support.  A lot of problems are solved with server (and with
+   client as well) if we add pthread support.  We can forget things such
+   as non-blocking connecting etc, and we can do things such as DNS/IP
+   lookups async.  The server itself also benefits great deal from 
+   threads, especially from performance point of view.
+
+   But, this is not a small task and almost entire SILC Library has to
+   be made re-entrant.  Own API is probably added for the threads support
+   to make changes in the future as painless as possible.  So the API 
+   would have things like silc_mutex_lock, silc_mutex_unlock and 
+   friends...
+
+ 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.
+
+ o SSH2 public keys support.  Maybe - not really needed but could be
+   nice as SSH is widely used all over the place.  SILC Protocol 
+   supports SSH2 public keys.
+
+ o IRC support for SILC client.  This would be nice to have on client
+   as it could be used to connect to SILC and IRC.  People wouldn't
+   have to have two different clients when same would work on both.
+   I'd like to see this done as SIM, after the extended SIM support
+   has been added to SILC.
+
+ o Cipher optimizations (asm, that this) at least for i386 would be nice.
+</pre>
+<p>
+
+</td>
+</tr>
+</table>
+</body>
+</html>
\ No newline at end of file