Added flags parameter to assemble_security_properties function.
[silc.git] / lib / silcske / silcske.h
1 /*
2
3   silcske.h
4
5   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
6
7   Copyright (C) 2000 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13   
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19 */
20
21 #ifndef SILCSKE_H
22 #define SILCSKE_H
23
24 #include "silcske_status.h"
25
26 /* Forward declaration for SKE object. */
27 typedef struct SilcSKEStruct *SilcSKE;
28
29 /* Forward declaration for security properties. */
30 typedef struct SilcSKESecurityPropertiesStruct *SilcSKESecurityProperties;
31
32 /* Supported Public Key Types, defined by the protocol */
33 typedef enum {
34   SILC_SKE_PK_TYPE_SILC = 1,    /* Mandatory type */
35   /* Optional types. These are not implemented currently
36   SILC_SKE_PK_TYPE_SSH2 = 2,
37   SILC_SKE_PK_TYPE_X509V3 = 3,
38   SILC_SKE_PK_TYPE_OPENPGP = 4,
39   SILC_SKE_PK_TYPE_SPKI = 5
40   */
41 } SilcSKEPKType;
42
43 /* Packet sending callback. Caller of the SKE routines must provide
44    a routine to send packets to negotiation parties. */
45 typedef void (*SilcSKESendPacketCb)(SilcSKE ske, SilcBuffer packet, 
46                                     SilcPacketType type, void *context);
47
48 /* Generic SKE callback function. This is called in various SKE
49    routines. The SilcSKE object sent as argument provides all the data
50    callers routine might need (payloads etc). */
51 typedef void (*SilcSKECb)(SilcSKE ske, void *context);
52
53 /* Callback function used to verify the received public key. */
54 typedef SilcSKEStatus (*SilcSKEVerifyCb)(SilcSKE ske, 
55                                          unsigned char *pk_data,
56                                          unsigned int pk_len,
57                                          SilcSKEPKType pk_type,
58                                          void *context);
59
60 /* Context passed to key material processing function. The function
61    returns the processed key material into this structure. */
62 typedef struct {
63   unsigned char *send_iv;
64   unsigned char *receive_iv;
65   unsigned int iv_len;
66   unsigned char *send_enc_key;
67   unsigned char *receive_enc_key;
68   unsigned int enc_key_len;
69   unsigned char *hmac_key;
70   unsigned int hmac_key_len;
71 } SilcSKEKeyMaterial;
72
73 /* Length of cookie in Start Payload */
74 #define SILC_SKE_COOKIE_LEN 16
75
76 #include "groups.h"
77 #include "payload.h"
78
79 /* Security Property Flags. */
80 typedef enum {
81   SILC_SKE_SP_FLAG_NONE      = (1L << 0),
82   SILC_SKE_SP_FLAG_NO_REPLY  = (1L << 1),
83   SILC_SKE_SP_FLAG_PFS       = (1L << 2),
84 } SilcSKESecurityPropertyFlag;
85
86 /* Security Properties negotiated between key exchange parties. This
87    structure is filled from the Key Exchange Start Payload which is used
88    to negotiate what security properties should be used in the
89    communication. */
90 struct SilcSKESecurityPropertiesStruct {
91   unsigned char flags;
92   SilcSKEDiffieHellmanGroup group;
93   SilcPKCS pkcs;
94   SilcCipher cipher;
95   SilcHash hash;
96   /* XXX SilcCompression comp; */
97 };
98
99 struct SilcSKEStruct {
100   /* The connection object. This is initialized by the caller. */
101   SilcSocketConnection sock;
102
103   /* Security properties negotiated */
104   SilcSKESecurityProperties prop;
105
106   /* Key Exchange payloads filled during key negotiation with
107      remote data. Responder may save local data here as well. */
108   SilcSKEStartPayload *start_payload;
109   SilcSKEOnePayload *ke1_payload;
110   SilcSKETwoPayload *ke2_payload;
111
112   /* Temporary copy of the KE Start Payload used in the
113      HASH computation. */
114   SilcBuffer start_payload_copy;
115
116   /* If initiator, this is responders public key. If responder this
117      is our own public key. */
118   unsigned char *pk;
119   unsigned int pk_len;
120
121   /* Random number x, 1 < x < q. This is the secret exponent
122      used in Diffie Hellman computations. */
123   SilcInt x;
124   
125   /* The secret shared key */
126   SilcInt KEY;
127   
128   /* The hash value HASH of the key exchange */
129   unsigned char *hash;
130   unsigned int hash_len;
131
132   /* Random Number Generator. This is set by the caller and must
133      be free'd by the caller. */
134   SilcRng rng;
135
136   /* Pointer to the what ever user data. This is set by the caller
137      and is not touched by the SKE. The caller must also free this one. */
138   void *user_data;
139 };
140
141 /* Prototypes */
142 SilcSKE silc_ske_alloc();
143 void silc_ske_free(SilcSKE ske);
144 SilcSKEStatus silc_ske_initiator_start(SilcSKE ske, SilcRng rng,
145                                        SilcSocketConnection sock,
146                                        SilcSKEStartPayload *start_payload,
147                                        SilcSKESendPacketCb send_packet,
148                                        void *context);
149 SilcSKEStatus silc_ske_initiator_phase_1(SilcSKE ske, 
150                                          SilcBuffer start_payload,
151                                          SilcSKECb callback,
152                                          void *context);
153 SilcSKEStatus silc_ske_initiator_phase_2(SilcSKE ske,
154                                          SilcPublicKey public_key,
155                                          SilcSKESendPacketCb send_packet,
156                                          void *context);
157 SilcSKEStatus silc_ske_initiator_finish(SilcSKE ske,
158                                         SilcBuffer ke2_payload,
159                                         SilcSKEVerifyCb verify_key,
160                                         void *verify_context,
161                                         SilcSKECb callback,
162                                         void *context);
163 SilcSKEStatus silc_ske_responder_start(SilcSKE ske, SilcRng rng,
164                                        SilcSocketConnection sock,
165                                        char *version,
166                                        SilcBuffer start_payload,
167                                        SilcSKECb callback,
168                                        void *context);
169 SilcSKEStatus silc_ske_responder_phase_1(SilcSKE ske, 
170                                          SilcSKEStartPayload *start_payload,
171                                          SilcSKESendPacketCb send_packet,
172                                          void *context);
173 SilcSKEStatus silc_ske_responder_phase_2(SilcSKE ske,
174                                          SilcBuffer ke1_payload,
175                                          SilcSKECb callback,
176                                          void *context);
177 SilcSKEStatus silc_ske_responder_finish(SilcSKE ske,
178                                         SilcPublicKey public_key,
179                                         SilcPrivateKey private_key,
180                                         SilcSKEPKType pk_type,
181                                         SilcSKESendPacketCb send_packet,
182                                         void *context);
183 SilcSKEStatus silc_ske_end(SilcSKE ske,
184                            SilcSKESendPacketCb send_packet,
185                            void *context);
186 SilcSKEStatus silc_ske_abort(SilcSKE ske, SilcSKEStatus status,
187                              SilcSKESendPacketCb send_packet,
188                              void *context);
189 SilcSKEStatus 
190 silc_ske_assemble_security_properties(SilcSKE ske,
191                                       unsigned char flags,
192                                       char *version,
193                                       SilcSKEStartPayload **return_payload);
194 SilcSKEStatus 
195 silc_ske_select_security_properties(SilcSKE ske,
196                                     char *version,
197                                     SilcSKEStartPayload *payload,
198                                     SilcSKEStartPayload *remote_payload);
199 SilcSKEStatus silc_ske_create_rnd(SilcSKE ske, SilcInt n, 
200                                   unsigned int len, 
201                                   SilcInt *rnd);
202 SilcSKEStatus silc_ske_make_hash(SilcSKE ske, 
203                                  unsigned char *return_hash,
204                                  unsigned int *return_hash_len);
205 SilcSKEStatus silc_ske_process_key_material(SilcSKE ske, 
206                                             unsigned int req_iv_len,
207                                             unsigned int req_enc_key_len,
208                                             unsigned int req_hmac_key_len,
209                                             SilcSKEKeyMaterial *key);
210 #endif