/* Supported Public Key Types, defined by the protocol */
typedef enum {
- SILC_SKE_PK_TYPE_SILC = 1, /* Mandatory type */
- /* Optional types. These are not implemented currently
- SILC_SKE_PK_TYPE_SSH2 = 2,
- SILC_SKE_PK_TYPE_X509V3 = 3,
+ SILC_SKE_PK_TYPE_SILC = 1, /* Mandatory type */
+ /* Optional types. These are not implemented currently */
+ SILC_SKE_PK_TYPE_SSH2 = 2,
+ SILC_SKE_PK_TYPE_X509V3 = 3,
SILC_SKE_PK_TYPE_OPENPGP = 4,
- SILC_SKE_PK_TYPE_SPKI = 5
- */
+ SILC_SKE_PK_TYPE_SPKI = 5
} SilcSKEPKType;
/* Packet sending callback. Caller of the SKE routines must provide
SilcPKCS pkcs;
SilcCipher cipher;
SilcHash hash;
- /* XXX SilcCompression comp; */
+ SilcHmac hmac;
+ /* XXX SilcZip comp; */
};
struct SilcSKEStruct {
/* Random number x, 1 < x < q. This is the secret exponent
used in Diffie Hellman computations. */
- SilcInt x;
+ SilcInt *x;
/* The secret shared key */
- SilcInt KEY;
+ SilcInt *KEY;
/* The hash value HASH of the key exchange */
unsigned char *hash;
/* Pointer to the what ever user data. This is set by the caller
and is not touched by the SKE. The caller must also free this one. */
void *user_data;
+
+ /* Current status of SKE */
+ SilcSKEStatus status;
};
/* Prototypes */
SilcSKEStatus silc_ske_make_hash(SilcSKE ske,
unsigned char *return_hash,
unsigned int *return_hash_len);
+SilcSKEStatus
+silc_ske_process_key_material_data(unsigned char *data,
+ unsigned int data_len,
+ unsigned int req_iv_len,
+ unsigned int req_enc_key_len,
+ unsigned int req_hmac_key_len,
+ SilcHash hash,
+ SilcSKEKeyMaterial *key);
SilcSKEStatus silc_ske_process_key_material(SilcSKE ske,
unsigned int req_iv_len,
unsigned int req_enc_key_len,
unsigned int req_hmac_key_len,
SilcSKEKeyMaterial *key);
+SilcSKEStatus silc_ske_check_version(SilcSKE ske,
+ unsigned char *version,
+ unsigned int version_len);
+void silc_ske_free_key_material(SilcSKEKeyMaterial *key);
+
#endif