X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Firssi%2Fsrc%2Fsilc%2Fcore%2Fsilc-queries.c;h=18590f767e5d15defcb07a8726b9157fc07e7bf4;hb=be10e71673bc538573b1805ee2115f2a3a7281a2;hp=3da82845914b2b6947a61b4fd68561f34058483d;hpb=c257b555225193e54d85daf541d29578b3c93882;p=silc.git diff --git a/apps/irssi/src/silc/core/silc-queries.c b/apps/irssi/src/silc/core/silc-queries.c index 3da82845..18590f76 100644 --- a/apps/irssi/src/silc/core/silc-queries.c +++ b/apps/irssi/src/silc/core/silc-queries.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2002 Pekka Riikonen + Copyright (C) 2002 - 2008 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 @@ -247,7 +247,7 @@ void silc_query_attributes_default(SilcClient client, const char *sv; SilcUInt32 tmp_len, mask; SilcAttributeObjService service; - SilcAttributeObjMime mime; + SilcMime mime; SilcAttributeObjGeo geo; SilcAttributeObjDevice dev; SilcAttributeObjPk pk; @@ -255,7 +255,6 @@ void silc_query_attributes_default(SilcClient client, bool allowed; memset(&service, 0, sizeof(service)); - memset(&mime, 0, sizeof(mime)); memset(&geo, 0, sizeof(geo)); memset(&dev, 0, sizeof(dev)); memset(&pk, 0, sizeof(pk)); @@ -293,7 +292,7 @@ void silc_query_attributes_default(SilcClient client, /* Put USER_INFO */ silc_client_attribute_del(silc_client, conn, SILC_ATTRIBUTE_USER_INFO, NULL); - tmp = silc_file_readfile(sv, &tmp_len); + tmp = silc_file_readfile(sv, &tmp_len, NULL); if (tmp) { tmp[tmp_len] = 0; if (silc_vcard_decode(tmp, tmp_len, &vcard)) @@ -365,7 +364,8 @@ void silc_query_attributes_default(SilcClient client, mask |= SILC_ATTRIBUTE_MOOD_ANXIOUS; } silc_client_attribute_add(silc_client, conn, - SILC_ATTRIBUTE_STATUS_MOOD, (void *)mask, + SILC_ATTRIBUTE_STATUS_MOOD, + SILC_32_TO_PTR(mask), sizeof(SilcUInt32)); g_strfreev(list); } @@ -385,14 +385,13 @@ void silc_query_attributes_default(SilcClient client, /* Put STATUS_MESSAGE */ silc_client_attribute_del(silc_client, conn, SILC_ATTRIBUTE_STATUS_MESSAGE, NULL); - tmp = silc_file_readfile(sv, &tmp_len); + tmp = silc_file_readfile(sv, &tmp_len, NULL); if (tmp) { - tmp[tmp_len] = 0; - mime.mime = (const unsigned char *)tmp; - mime.mime_len = tmp_len; - silc_client_attribute_add(silc_client, conn, - SILC_ATTRIBUTE_STATUS_MESSAGE, &mime, - sizeof(mime)); + mime = silc_mime_decode(NULL, tmp, tmp_len); + if (mime) + silc_client_attribute_add(silc_client, conn, + SILC_ATTRIBUTE_STATUS_MESSAGE, mime, + sizeof(*mime)); } silc_free(tmp); } @@ -437,7 +436,8 @@ void silc_query_attributes_default(SilcClient client, mask |= SILC_ATTRIBUTE_CONTACT_VIDEO; } silc_client_attribute_add(silc_client, conn, - SILC_ATTRIBUTE_PREFERRED_CONTACT, (void *)mask, + SILC_ATTRIBUTE_PREFERRED_CONTACT, + SILC_32_TO_PTR(mask), sizeof(SilcUInt32)); g_strfreev(list); } @@ -531,7 +531,7 @@ void silc_query_attributes_default(SilcClient client, list = g_strsplit(sv, " ", -1); for (entry = list; *entry != NULL; entry++) { if (!strncasecmp(*entry, "silc-rsa:", 8)) { - tmp = silc_file_readfile((*entry) + 8, &tmp_len); + tmp = silc_file_readfile((*entry) + 8, &tmp_len, NULL); if (tmp) { tmp[tmp_len] = 0; pk.type = "silc-rsa"; @@ -555,12 +555,18 @@ typedef struct { SILC_SERVER_REC *server; char *name; SilcAttributeObjPk userpk; + SilcPublicKey public_key; SilcVCardStruct vcard; - SilcAttributeObjMime message; - SilcAttributeObjMime extension; + SilcMime message; + SilcMime extension; bool nopk; } *AttrVerify; +static void silc_query_attributes_verify(SilcBool success, void *context) +{ + *(SilcBool *)context = success; +} + void silc_query_attributes_print(SILC_SERVER_REC *server, SilcClient client, SilcClientConnection conn, @@ -666,8 +672,11 @@ void silc_query_attributes_print(SILC_SERVER_REC *server, case SILC_ATTRIBUTE_STATUS_MESSAGE: { - if (!silc_attribute_get_object(attr, (void *)&verify->message, - sizeof(verify->message))) + verify->message = silc_mime_alloc(); + if (!verify->message) + continue; + if (!silc_attribute_get_object(attr, (void *)verify->message, + sizeof(*verify->message))) continue; printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP, SILCTXT_ATTR_STATUS_MESSAGE, @@ -722,8 +731,11 @@ void silc_query_attributes_print(SILC_SERVER_REC *server, case SILC_ATTRIBUTE_EXTENSION: { - if (!silc_attribute_get_object(attr, (void *)&verify->extension, - sizeof(verify->extension))) + verify->extension = silc_mime_alloc(); + if (!verify->extension) + continue; + if (!silc_attribute_get_object(attr, (void *)verify->extension, + sizeof(*verify->extension))) continue; printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP, SILCTXT_ATTR_EXTENSION, @@ -816,72 +828,100 @@ void silc_query_attributes_print(SILC_SERVER_REC *server, /* Handle the signature verifications and public key verifying here */ - if (usersign.data && !strcmp(verify->userpk.type, "silc-rsa")) { + if (verify->userpk.data) { + SilcPKCSType type = 0; + + if (!strcmp(verify->userpk.type, "silc-rsa")) + type = SILC_PKCS_SILC; + else if (!strcmp(verify->userpk.type, "ssh-rsa")) + type = SILC_PKCS_SSH2; + else if (!strcmp(verify->userpk.type, "x509v3-sign-rsa")) + type = SILC_PKCS_X509V3; + else if (!strcmp(verify->userpk.type, "pgp-sign-rsa")) + type = SILC_PKCS_OPENPGP; + + silc_pkcs_public_key_alloc(type, verify->userpk.data, + verify->userpk.data_len, + &verify->public_key); + } + + if (usersign.data) { /* Verify the signature now */ - SilcPublicKey public_key; - SilcPKCS pkcs; unsigned char *verifyd; SilcUInt32 verify_len; + SilcBool verified = FALSE; - if (silc_pkcs_public_key_decode(verify->userpk.data, - verify->userpk.data_len, - &public_key)) { - silc_pkcs_alloc("rsa", &pkcs); + if (verify->public_key) { verifyd = silc_attribute_get_verify_data(attrs, FALSE, &verify_len); - if (verifyd && silc_pkcs_public_key_set(pkcs, public_key)){ - if (silc_pkcs_verify_with_hash(pkcs, client->sha1hash, - usersign.data, - usersign.data_len, - verifyd, verify_len)) { - printformat_module("fe-common/silc", server, NULL, - MSGLEVEL_CRAP, SILCTXT_ATTR_USER_SIGN_VERIFIED); - } else { - printformat_module("fe-common/silc", server, NULL, - MSGLEVEL_CRAP, SILCTXT_ATTR_USER_SIGN_FAILED); - } + if (verifyd) + silc_pkcs_verify_async(verify->public_key, usersign.data, + usersign.data_len, verifyd, verify_len, + TRUE, sha1hash, + silc_query_attributes_verify, &verified); + + if (verified) { + printformat_module("fe-common/silc", server, NULL, + MSGLEVEL_CRAP, SILCTXT_ATTR_USER_SIGN_VERIFIED); + } else { + printformat_module("fe-common/silc", server, NULL, + MSGLEVEL_CRAP, SILCTXT_ATTR_USER_SIGN_FAILED); } - silc_pkcs_public_key_free(public_key); silc_free(verifyd); + } else { + printformat_module("fe-common/silc", server, NULL, + MSGLEVEL_CRAP, SILCTXT_ATTR_USER_SIGN_FAILED); } } else { printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP, SILCTXT_ATTR_USER_SIGN_NOT_PRESENT); } - if (serversign.data && !strcmp(serverpk.type, "silc-rsa")) { + if (serversign.data) { /* Verify the signature now */ SilcPublicKey public_key; - SilcPKCS pkcs; + SilcPKCSType type = 0; unsigned char *verifyd; SilcUInt32 verify_len; - - if (silc_pkcs_public_key_decode(serverpk.data, serverpk.data_len, - &public_key)) { - silc_pkcs_alloc("rsa", &pkcs); + SilcBool verified = FALSE; + + if (!strcmp(serverpk.type, "silc-rsa")) + type = SILC_PKCS_SILC; + else if (!strcmp(serverpk.type, "ssh-rsa")) + type = SILC_PKCS_SSH2; + else if (!strcmp(serverpk.type, "x509v3-sign-rsa")) + type = SILC_PKCS_X509V3; + else if (!strcmp(serverpk.type, "pgp-sign-rsa")) + type = SILC_PKCS_OPENPGP; + + if (silc_pkcs_public_key_alloc(type, serverpk.data, + serverpk.data_len, + &public_key)) { verifyd = silc_attribute_get_verify_data(attrs, TRUE, &verify_len); - if (verifyd && silc_pkcs_public_key_set(pkcs, public_key)) { - if (silc_pkcs_verify_with_hash(pkcs, client->sha1hash, - serversign.data, - serversign.data_len, - verifyd, verify_len)) { - printformat_module("fe-common/silc", server, NULL, - MSGLEVEL_CRAP, SILCTXT_ATTR_SERVER_SIGN_VERIFIED); - } else { - printformat_module("fe-common/silc", server, NULL, - MSGLEVEL_CRAP, SILCTXT_ATTR_SERVER_SIGN_FAILED); - } + if (verifyd) + silc_pkcs_verify_async(public_key, serversign.data, + serversign.data_len, verifyd, + verify_len, TRUE, sha1hash, + silc_query_attributes_verify, &verified); + if (verified) { + printformat_module("fe-common/silc", server, NULL, + MSGLEVEL_CRAP, SILCTXT_ATTR_SERVER_SIGN_VERIFIED); + } else { + printformat_module("fe-common/silc", server, NULL, + MSGLEVEL_CRAP, SILCTXT_ATTR_SERVER_SIGN_FAILED); } silc_pkcs_public_key_free(public_key); silc_free(verifyd); + } else { + printformat_module("fe-common/silc", server, NULL, + MSGLEVEL_CRAP, SILCTXT_ATTR_SERVER_SIGN_FAILED); } } - if (verify->userpk.data) { - silc_verify_public_key(client, conn, SILC_SOCKET_TYPE_CLIENT, - verify->userpk.data, verify->userpk.data_len, - SILC_SKE_PK_TYPE_SILC, + if (verify->public_key) { + silc_verify_public_key(client, conn, SILC_CONN_CLIENT, + verify->public_key, silc_query_attributes_print_final, verify); } else { verify->nopk = TRUE; @@ -892,7 +932,6 @@ void silc_query_attributes_print(SILC_SERVER_REC *server, static void silc_query_attributes_print_final(bool success, void *context) { AttrVerify verify = context; - SilcClient client = verify->client; SILC_SERVER_REC *server = verify->server; char *format = NULL; unsigned char filename[256], *fingerprint = NULL, *tmp; @@ -915,7 +954,7 @@ static void silc_query_attributes_print_final(bool success, void *context) MSGLEVEL_CRAP, SILCTXT_ATTR_FOOTER); /* Replace all whitespaces with `_'. */ - fingerprint = silc_hash_fingerprint(client->sha1hash, + fingerprint = silc_hash_fingerprint(sha1hash, verify->userpk.data, verify->userpk.data_len); for (i = 0; i < strlen(fingerprint); i++) @@ -945,7 +984,6 @@ static void silc_query_attributes_print_final(bool success, void *context) static void silc_query_attributes_accept(const char *line, void *context) { AttrVerify verify = context; - SilcClient client = verify->client; SILC_SERVER_REC *server = verify->server; struct stat st; struct passwd *pw; @@ -963,7 +1001,7 @@ static void silc_query_attributes_accept(const char *line, void *context) goto out; /* Replace all whitespaces with `_'. */ - fingerprint = silc_hash_fingerprint(client->sha1hash, + fingerprint = silc_hash_fingerprint(sha1hash, verify->userpk.data, verify->userpk.data_len); for (i = 0; i < strlen(fingerprint); i++) @@ -1007,29 +1045,32 @@ static void silc_query_attributes_accept(const char *line, void *context) } /* Save public key */ - memset(filename2, 0, sizeof(filename2)); - snprintf(filename2, sizeof(filename2) - 1, "%s/clientkey_%s.pub", - filename, fingerprint); - silc_pkcs_save_public_key_data(filename2, verify->userpk.data, - verify->userpk.data_len, - SILC_PKCS_FILE_PEM); + if (verify->public_key) { + memset(filename2, 0, sizeof(filename2)); + snprintf(filename2, sizeof(filename2) - 1, "%s/clientkey_%s.pub", + filename, fingerprint); + silc_pkcs_save_public_key(filename2, verify->public_key, + SILC_PKCS_FILE_BASE64); + } /* Save extension data */ - if (verify->extension.mime) { + if (verify->extension) { memset(filename2, 0, sizeof(filename2)); snprintf(filename2, sizeof(filename2) - 1, "%s/extension.mime", filename); - silc_file_writefile(filename2, verify->extension.mime, - verify->extension.mime_len); + tmp = silc_mime_encode(verify->extension, &len); + if (tmp) + silc_file_writefile(filename2, tmp, len); } /* Save MIME message data */ - if (verify->message.mime) { + if (verify->message) { memset(filename2, 0, sizeof(filename2)); snprintf(filename2, sizeof(filename2) - 1, "%s/status_message.mime", filename); - silc_file_writefile(filename2, verify->message.mime, - verify->message.mime_len); + tmp = silc_mime_encode(verify->message, &len); + if (tmp) + silc_file_writefile(filename2, tmp, len); } printformat_module("fe-common/silc", server, NULL,