/* 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 */
silc_snprintf(email, sizeof(email), "%s@%s", username, hostname);
- ident = silc_pkcs_silc_encode_identifier(username, hostname, realname,
+ ident = silc_pkcs_silc_encode_identifier(NULL, username, hostname, realname,
email, NULL, NULL, NULL);
if (realname)
silc_free(realname);
}
} 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);
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);
return FALSE;
/* Save public key into file */
- silc_pkcs_save_public_key(pkfile, 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, 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;
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);
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;
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);
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;
}
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);
{ 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 }
};
return FALSE;
cp = (char *)version + 5;
- if (!cp)
+ if (!cp || !(*cp))
return FALSE;
/* Take protocol 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;
{
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));
- silc_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));
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));
silc_snprintf(tmp, sizeof(tmp) - 1, ",%02x,", client_id->rnd);
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));
- silc_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));