+Sat Dec 16 17:39:54 EET 2000 Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+ * Implemented version string checking to both client and server.
+ The check is incomplete currently due to the abnormal version
+ strings used in development version of SILC.
+
Fri Dec 15 15:55:12 EET 2000 Pekka Riikonen <priikone@poseidon.pspt.fi>
* Changed char *data to unsigned char *data in ID Cache system to
sock->user_data = (void *)conn_data;
}
-/* XXX TODO */
+/* Check remote host version string */
SilcSKEStatus silc_ske_check_version(SilcSKE ske, unsigned char *version,
unsigned int len)
{
- return SILC_SKE_STATUS_OK;
+ SilcSKEStatus status = SILC_SKE_STATUS_OK;
+
+ /* Check for initial version string */
+ if (!strstr(version, "SILC-1.0-"))
+ status = SILC_SKE_STATUS_BAD_VERSION;
+
+ /* Check software version */
+
+ if (len < strlen(silc_version_string))
+ status = SILC_SKE_STATUS_BAD_VERSION;
+
+ /* XXX for now there is no other tests due to the abnormal version
+ string that is used */
+
+ return status;
}
/* Performs key exchange protocol. This is used for both initiator
silc_hmac_set_key(conn->hmac, keymat->hmac_key, keymat->hmac_key_len);
}
-/* XXX TODO */
+/* Checks the version string of the server. */
SilcSKEStatus silc_ske_check_version(SilcSKE ske, unsigned char *version,
unsigned int len)
{
- return SILC_SKE_STATUS_OK;
+ SilcSocketConnection conn = (SilcSocketConnection)ske->sock->user_data;
+ SilcClient client = (SilcClient)ske->user_data;
+ SilcSKEStatus status = SILC_SKE_STATUS_OK;
+
+ /* Check for initial version string */
+ if (!strstr(version, "SILC-1.0-"))
+ status = SILC_SKE_STATUS_BAD_VERSION;
+
+ /* Check software version */
+
+ if (len < strlen(silc_version_string))
+ status = SILC_SKE_STATUS_BAD_VERSION;
+
+ /* XXX for now there is no other tests due to the abnormal version
+ string that is used */
+
+ if (status != SILC_SKE_STATUS_OK)
+ client->ops->say(client, conn,
+ "We don't support server version `%s'", version);
+
+ return status;
}
/* Performs key exchange protocol. This is used for both initiator
ske = silc_ske_alloc();
ctx->ske = ske;
ske->rng = client->rng;
+ ske->user_data = (void *)client;
if (ctx->responder == TRUE) {
#if 0
SilcSKEStartPayload *payload,
SilcSKEStartPayload *remote_payload)
{
+ SilcSKEStatus status;
SilcSKEStartPayload *rp;
char *cp;
int len;
rp = remote_payload;
+ /* Check version string */
+ status = silc_ske_check_version(ske, rp->version, rp->version_len);
+ if (status != SILC_SKE_STATUS_OK)
+ return status;
+
/* Flags are returned unchanged. */
payload->flags = rp->flags;
payload->cookie_len = SILC_SKE_COOKIE_LEN;
memcpy(payload->cookie, rp->cookie, SILC_SKE_COOKIE_LEN);
- /* Check version string */
- silc_ske_check_version(ske, rp->version, rp->version_len);
-
/* Put our version to our reply */
payload->version = strdup(version);
payload->version_len = strlen(version);