X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcapputil%2Fsilcapputil.c;h=573d4585e17a9f0ba439658351165effe749702f;hb=1ea936cbf1bb3b19bd55839b904ef59ada84b8b5;hp=2e9fbe685ff6bc3e51a86005aaec33ca77f0d877;hpb=a1147987426a9b092b96aa75a37f4f256804373e;p=silc.git diff --git a/lib/silcapputil/silcapputil.c b/lib/silcapputil/silcapputil.c index 2e9fbe68..573d4585 100644 --- a/lib/silcapputil/silcapputil.c +++ b/lib/silcapputil/silcapputil.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2002 - 2006 Pekka Riikonen + Copyright (C) 2002 - 2007 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 @@ -31,19 +31,23 @@ static char *silc_create_pk_identifier(void) /* Get hostname */ hostname = silc_net_localhost(); - if (!hostname) + if (!hostname) { + fprintf(stderr, "Could not resolve local hostname/IP address"); return NULL; + } /* Get username (mandatory) */ username = silc_get_username(); - if (!username) + if (!username) { + fprintf(stderr, "Could not determine username"); return NULL; + } /* Create default email address, whether it is right or not */ - snprintf(email, sizeof(email), "%s@%s", username, hostname); + silc_snprintf(email, sizeof(email), "%s@%s", username, hostname); - ident = silc_pkcs_silc_encode_identifier(username, hostname, realname, - email, NULL, NULL); + ident = silc_pkcs_silc_encode_identifier(NULL, username, hostname, realname, + email, NULL, NULL, NULL); if (realname) silc_free(realname); silc_free(hostname); @@ -71,6 +75,8 @@ SilcBool silc_create_key_pair(const char *pkcs_name, char *alg = pkcs_name ? strdup(pkcs_name) : NULL; char *identifier = pub_identifier ? strdup(pub_identifier) : NULL; char *pass = passphrase ? strdup(passphrase) : NULL; + SilcPublicKey public_key; + SilcPrivateKey private_key; if (interactive && (!alg || !pub_filename || !prv_filename)) printf("\ @@ -121,9 +127,9 @@ New pair of keys will be created. Please, answer to following questions.\n\ if (interactive) { memset(line, 0, sizeof(line)); if (def) - snprintf(line, sizeof(line), "Identifier [%s]: ", def); + silc_snprintf(line, sizeof(line), "Identifier [%s]: ", def); else - snprintf(line, sizeof(line), + silc_snprintf(line, sizeof(line), "Identifier (eg. UN=jon, HN=jon.dummy.com, " "RN=Jon Johnson, E=jon@dummy.com): "); @@ -134,8 +140,7 @@ New pair of keys will be created. Please, answer to following questions.\n\ } } else { if (!def) { - fprintf(stderr, "Could not create public key identifier: %s\n", - strerror(errno)); + fprintf(stderr, "Could not create public key identifier\n"); return FALSE; } identifier = strdup(def); @@ -144,6 +149,12 @@ New pair of keys will be created. Please, answer to following questions.\n\ silc_free(def); } + if (!strstr(identifier, "UN=") || !strstr(identifier, "HN=")) { + fprintf(stderr, "Invalid public key identifier. You must specify both " + "UN and HN\n"); + return FALSE; + } + rng = silc_rng_alloc(); silc_rng_init(rng); silc_rng_global_init(rng); @@ -151,7 +162,7 @@ New pair of keys will be created. Please, answer to following questions.\n\ if (!pkfile) { if (interactive) { memset(line, 0, sizeof(line)); - snprintf(line, sizeof(line), "Public key filename [public_key.pub]: "); + silc_snprintf(line, sizeof(line), "Public key filename [public_key.pub]: "); pkfile = silc_get_input(line, FALSE); } if (!pkfile) @@ -161,7 +172,7 @@ New pair of keys will be created. Please, answer to following questions.\n\ if (!prvfile) { if (interactive) { memset(line, 0, sizeof(line)); - snprintf(line, sizeof(line), "Private key filename [private_key.prv]: "); + silc_snprintf(line, sizeof(line), "Private key filename [private_key.prv]: "); prvfile = silc_get_input(line, FALSE); } if (!prvfile) @@ -190,19 +201,34 @@ New pair of keys will be created. Please, answer to following questions.\n\ } } + if (interactive) + printf("\nGenerating the key pair...\n"); + /* Generate keys */ - if (!silc_pkcs_silc_generate_key(alg, "pkcs1-no-oid", key_len_bits, - identifier, rng, return_public_key, - return_private_key)) + if (!silc_pkcs_silc_generate_key(alg, key_len_bits, + identifier, rng, &public_key, + &private_key)) return FALSE; /* Save public key into file */ - silc_pkcs_save_public_key(pkfile, *return_public_key, SILC_PKCS_FILE_BASE64); + if (!silc_pkcs_save_public_key(pkfile, public_key, SILC_PKCS_FILE_BASE64)) + return FALSE; /* Save private key into file */ - silc_pkcs_save_private_key(prvfile, *return_private_key, - (const unsigned char *)pass, strlen(pass), - SILC_PKCS_FILE_BIN, rng); + if (!silc_pkcs_save_private_key(prvfile, private_key, + (const unsigned char *)pass, strlen(pass), + SILC_PKCS_FILE_BIN, rng)) + return FALSE; + + if (return_public_key) + *return_public_key = public_key; + else + silc_pkcs_public_key_free(public_key); + + if (return_private_key) + *return_private_key = private_key; + else + silc_pkcs_private_key_free(private_key); printf("Public key has been saved into `%s'.\n", pkfile); printf("Private key has been saved into `%s'.\n", prvfile); @@ -234,7 +260,8 @@ SilcBool silc_load_key_pair(const char *pub_filename, SILC_LOG_DEBUG(("Loading public and private keys")); - if (!silc_pkcs_load_public_key(pub_filename, return_public_key)) { + if (!silc_pkcs_load_public_key(pub_filename, + SILC_PKCS_ANY, return_public_key)) { if (pass) memset(pass, 0, strlen(pass)); silc_free(pass); @@ -249,7 +276,10 @@ SilcBool silc_load_key_pair(const char *pub_filename, if (!silc_pkcs_load_private_key(prv_filename, (const unsigned char *)pass, strlen(pass), + SILC_PKCS_ANY, return_private_key)) { + silc_pkcs_public_key_free(*return_public_key); + *return_public_key = NULL; memset(pass, 0, strlen(pass)); silc_free(pass); return FALSE; @@ -271,25 +301,23 @@ SilcBool silc_show_public_key(SilcPublicKey public_key) SilcUInt32 pk_len; SilcUInt32 key_len = 0; - silc_pubkey = silc_pkcs_get_context(SILC_PKCS_SILC, public_key); - if (!silc_pubkey) { - silc_pkcs_public_key_free(public_key); + silc_pubkey = silc_pkcs_public_key_get_pkcs(SILC_PKCS_SILC, public_key); + if (!silc_pubkey) return FALSE; - } ident = &silc_pubkey->identifier; key_len = silc_pkcs_public_key_get_len(public_key); - pk = silc_pkcs_public_key_encode(public_key, &pk_len); - if (!pk) { - silc_pkcs_public_key_free(public_key); + pk = silc_pkcs_public_key_encode(NULL, public_key, &pk_len); + if (!pk) return FALSE; - } fingerprint = silc_hash_fingerprint(NULL, pk, pk_len); babbleprint = silc_hash_babbleprint(NULL, pk, pk_len); printf("Algorithm : %s\n", silc_pkcs_get_name(public_key)); if (key_len) printf("Key length (bits) : %d\n", (unsigned int)key_len); + if (ident->version) + printf("Version : %s\n", ident->version); if (ident->realname) printf("Real name : %s\n", ident->realname); if (ident->username) @@ -321,7 +349,8 @@ SilcBool silc_show_public_key_file(const char *pub_filename) SilcPublicKey public_key; SilcBool ret; - if (!silc_pkcs_load_public_key((char *)pub_filename, &public_key)) { + if (!silc_pkcs_load_public_key((char *)pub_filename, + SILC_PKCS_ANY, &public_key)) { fprintf(stderr, "Could not load public key file `%s'\n", pub_filename); return FALSE; } @@ -352,6 +381,7 @@ SilcBool silc_change_private_key_passphrase(const char *prv_filename, if (!silc_pkcs_load_private_key(prv_filename, (const unsigned char *)pass, strlen(pass), + SILC_PKCS_ANY, &private_key)) { memset(pass, 0, strlen(pass)); silc_free(pass); @@ -601,6 +631,7 @@ static const SilcStatusMessage silc_status_messages[] = { { STAT(OPERATION_ALLOWED), "Operation is not allowed" }, { STAT(BAD_SERVER), "Bad server name" }, { STAT(BAD_USERNAME), "Bad user name" }, + { STAT(NO_SUCH_PUBLIC_KEY), "Unknown public key" }, { 0, NULL } }; @@ -727,7 +758,7 @@ SilcBool silc_parse_version_string(const char *version, return FALSE; cp = (char *)version + 5; - if (!cp) + if (!cp || !(*cp)) return FALSE; /* Take protocol version */ @@ -741,11 +772,11 @@ SilcBool silc_parse_version_string(const char *version, min = atoi(cp); memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min); + silc_snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min); if (protocol_version) *protocol_version = atoi(buf); memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%d.%d", maj, min); + silc_snprintf(buf, sizeof(buf) - 1, "%d.%d", maj, min); if (protocol_version_string) *protocol_version_string = strdup(buf); @@ -767,11 +798,11 @@ SilcBool silc_parse_version_string(const char *version, } memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min); + silc_snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min); if (software_version) *software_version = atoi(buf); memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%d.%d", maj, min); + silc_snprintf(buf, sizeof(buf) - 1, "%d.%d", maj, min); if (software_version_string) *software_version_string = strdup(buf); @@ -781,6 +812,10 @@ SilcBool silc_parse_version_string(const char *version, cp = strchr(cp, '.') + 1; if (cp && *cp && vendor_version) *vendor_version = strdup(cp); + } else if (strchr(cp, ' ')) { + cp = strchr(cp, ' ') + 1; + if (cp && *cp && vendor_version) + *vendor_version = strdup(cp); } return TRUE; @@ -803,7 +838,7 @@ SilcUInt32 silc_version_to_num(const char *version) min = atoi(cp + 1); memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min); + silc_snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min); return (SilcUInt32)atoi(buf); } @@ -949,66 +984,39 @@ char *silc_id_render(void *id, SilcIdType id_type) { char tmp[100]; unsigned char tmps[2]; - char *cp; memset(rid, 0, sizeof(rid)); switch(id_type) { case SILC_ID_SERVER: { SilcServerID *server_id = (SilcServerID *)id; - if (server_id->ip.data_len > 4) { -#ifdef HAVE_IPV6 - struct sockaddr_in6 ipv6; - memset(&ipv6, 0, sizeof(ipv6)); - ipv6.sin6_family = AF_INET6; - memmove(&ipv6.sin6_addr, server_id->ip.data, sizeof(ipv6.sin6_addr)); - if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6), - tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST)) - _PUT_STRING(rid, tmp); -#endif - } else { - struct in_addr ipv4; - memmove(&ipv4.s_addr, server_id->ip.data, 4); - cp = inet_ntoa(ipv4); - if (cp) - _PUT_STRING(rid, cp); - } + + if (!silc_net_bin2addr(server_id->ip.data, server_id->ip.data_len, + tmp, sizeof(tmp))) + return NULL; memset(tmp, 0, sizeof(tmp)); - snprintf(tmp, sizeof(tmp) - 1, ",%d,", ntohs(server_id->port)); + silc_snprintf(tmp, sizeof(tmp) - 1, ",%d,", silc_ntohs(server_id->port)); _PUT_STRING(rid, tmp); SILC_PUT16_MSB(server_id->rnd, tmps); memset(tmp, 0, sizeof(tmp)); - snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x]", tmps[0], tmps[1]); + silc_snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x]", tmps[0], tmps[1]); _PUT_STRING(rid, tmp); } break; case SILC_ID_CLIENT: { SilcClientID *client_id = (SilcClientID *)id; - if (client_id->ip.data_len > 4) { -#ifdef HAVE_IPV6 - struct sockaddr_in6 ipv6; - memset(&ipv6, 0, sizeof(ipv6)); - ipv6.sin6_family = AF_INET6; - memmove(&ipv6.sin6_addr, client_id->ip.data, sizeof(ipv6.sin6_addr)); - if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6), - tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST)) - _PUT_STRING(rid, tmp); -#endif - } else { - struct in_addr ipv4; - memmove(&ipv4.s_addr, client_id->ip.data, 4); - cp = inet_ntoa(ipv4); - if (cp) - _PUT_STRING(rid, cp); - } + + if (!silc_net_bin2addr(client_id->ip.data, client_id->ip.data_len, + tmp, sizeof(tmp))) + return NULL; memset(tmp, 0, sizeof(tmp)); - snprintf(tmp, sizeof(tmp) - 1, ",%02x,", client_id->rnd); + silc_snprintf(tmp, sizeof(tmp) - 1, ",%02x,", client_id->rnd); _PUT_STRING(rid, tmp); memset(tmp, 0, sizeof(tmp)); - snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x %02x %02x...]", + silc_snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x %02x %02x...]", client_id->hash[0], client_id->hash[1], client_id->hash[2], client_id->hash[3]); _PUT_STRING(rid, tmp); @@ -1017,30 +1025,18 @@ char *silc_id_render(void *id, SilcIdType id_type) case SILC_ID_CHANNEL: { SilcChannelID *channel_id = (SilcChannelID *)id; - if (channel_id->ip.data_len > 4) { -#ifdef HAVE_IPV6 - struct sockaddr_in6 ipv6; - memset(&ipv6, 0, sizeof(ipv6)); - ipv6.sin6_family = AF_INET6; - memmove(&ipv6.sin6_addr, channel_id->ip.data, sizeof(ipv6.sin6_addr)); - if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6), - tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST)) - _PUT_STRING(rid, tmp); -#endif - } else { - struct in_addr ipv4; - memmove(&ipv4.s_addr, channel_id->ip.data, 4); - cp = inet_ntoa(ipv4); - if (cp) - _PUT_STRING(rid, cp); - } + + if (!silc_net_bin2addr(channel_id->ip.data, channel_id->ip.data_len, + tmp, sizeof(tmp))) + return NULL; memset(tmp, 0, sizeof(tmp)); - snprintf(tmp, sizeof(tmp) - 1, ",%d,", ntohs(channel_id->port)); + silc_snprintf(tmp, sizeof(tmp) - 1, ",%d,", + silc_ntohs(channel_id->port)); _PUT_STRING(rid, tmp); SILC_PUT16_MSB(channel_id->rnd, tmps); memset(tmp, 0, sizeof(tmp)); - snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x]", tmps[0], tmps[1]); + silc_snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x]", tmps[0], tmps[1]); _PUT_STRING(rid, tmp); } break;