Merged silc_1_0_branch to trunk.
[silc.git] / apps / silcd / protocol.h
index 2b1b9c232d6342f256b906a87ad1a74c5dbe1531..3c184abce2ae2363f1193d1f1dd38ee316037258 100644 (file)
@@ -2,15 +2,14 @@
 
   protocol.h
 
-  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+  Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2001 Pekka Riikonen
+  Copyright (C) 1997 - 2003 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
-  (at your option) any later version.
-  
+  the Free Software Foundation; version 2 of the License.
+
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 #define PROTOCOL_H
 
 /* SILC client protocol types */
-#define SILC_PROTOCOL_SERVER_NONE 0
-#define SILC_PROTOCOL_SERVER_CONNECTION_AUTH 1
-#define SILC_PROTOCOL_SERVER_KEY_EXCHANGE 2
-/* #define SILC_PROTOCOL_SERVER_MAX 255 */
+#define SILC_PROTOCOL_SERVER_NONE               0
+#define SILC_PROTOCOL_SERVER_CONNECTION_AUTH    1
+#define SILC_PROTOCOL_SERVER_KEY_EXCHANGE       2
+#define SILC_PROTOCOL_SERVER_REKEY              3
+#define SILC_PROTOCOL_SERVER_BACKUP             4
+/* #define SILC_PROTOCOL_SERVER_MAX             255 */
 
 /* Internal context for Key Exchange protocol. */
 typedef struct {
@@ -35,15 +36,21 @@ typedef struct {
   SilcRng rng;
 
   /* TRUE if we are receiveing part of the protocol */
-  int responder;
+  bool responder;
 
   /* Destinations ID taken from authenticataed packet so that we can
      get the destinations ID. */
   void *dest_id;
   SilcIdType dest_id_type;
 
+  /* Pointers to the configurations. Defined only when responder is TRUE */
+  SilcServerConfigRef cconfig;
+  SilcServerConfigRef sconfig;
+  SilcServerConfigRef rconfig;
+
   SilcTask timeout_task;
   SilcPacketContext *packet;
+  SilcSKESecurityPropertyFlag flags;
   SilcSKE ske;
   SilcSKEKeyMaterial *keymat;
 } SilcServerKEInternalContext;
@@ -55,41 +62,56 @@ typedef struct {
   SilcSocketConnection sock;
 
   /* TRUE if we are receiving part of the protocol */
-  int responder;
+  bool responder;
 
   /* SKE object from Key Exchange protocol. */
   SilcSKE ske;
 
-  /* Auth method that must be used. This is resolved before this
-     connection authentication protocol is started. Used when we are
-     initiating. */
-  unsigned int auth_meth;
-
-  /* Authentication data if we alreay know it. This is filled before
-     starting the protocol if we know the authentication data. Otherwise
-     these are and remain NULL. Used when we are initiating. */
+  /* Authentication method and data if we alreay know it. This is filled
+     before starting the protocol if we know the authentication data.
+     Otherwise these are and remain NULL. Used when we are initiating. */
+  SilcUInt32 auth_meth;
   void *auth_data;
-  unsigned int auth_data_len;
+  SilcUInt32 auth_data_len;
 
   /* Destinations ID from KE protocol context */
   void *dest_id;
   SilcIdType dest_id_type;
 
+  /* Pointers to the configurations. Defined only when responder is TRUE */
+  SilcServerConfigRef cconfig;
+  SilcServerConfigRef sconfig;
+  SilcServerConfigRef rconfig;
+
   SilcTask timeout_task;
   SilcPacketContext *packet;
-  unsigned short conn_type;
+  SilcUInt16 conn_type;
 } SilcServerConnAuthInternalContext;
 
+/* Internal context for the rekey protocol */
+typedef struct {
+  void *server;
+  void *context;
+  SilcSocketConnection sock;
+  bool responder;                  /* TRUE if we are receiving party */
+  bool pfs;                        /* TRUE if PFS is to be used */
+  SilcSKE ske;                     /* Defined if PFS is used */
+  SilcPacketContext *packet;
+  SilcTask timeout_task;
+} SilcServerRekeyInternalContext;
+
 /* Prototypes */
 void silc_server_protocols_register(void);
 void silc_server_protocols_unregister(void);
-int silc_server_protocol_ke_set_keys(SilcSKE ske,
+int silc_server_protocol_ke_set_keys(SilcServer server,
+                                    SilcSKE ske,
                                     SilcSocketConnection sock,
                                     SilcSKEKeyMaterial *keymat,
                                     SilcCipher cipher,
                                     SilcPKCS pkcs,
                                     SilcHash hash,
                                     SilcHmac hmac,
-                                    int is_responder);
+                                    SilcSKEDiffieHellmanGroup group,
+                                    bool is_responder);
 
 #endif