static SilcServer silcd;
static void silc_usage(void);
-static char *silc_server_create_identifier(void);
-static int silc_server_create_key_pair(char *pkcs_name, int bits, char *path,
- char *identifier,
- SilcPublicKey *ret_pub_key,
- SilcPrivateKey *ret_prv_key);
/* Long command line options */
static struct option long_opts[] =
STAT_OUTPUT(" Packets sent : %d", silcd->stat.packets_sent);
STAT_OUTPUT(" Packets received : %d", silcd->stat.packets_received);
+#undef STAT_OUTPUT
+
fflush(fdd);
fclose(fdd);
}
} DebugLevel;
static DebugLevel debug_levels[] = {
- /* Basic stuff from silcd/ */
- { 5, "silc_server_*" },
+ /* Very basic stuff from silcd/ */
+ { 3, "silcd\\.c,server\\.c" },
+
+ /* More stuff from silcd/ */
+ { 7, "silcd\\.c,server\\.c,command\\.c,server_backup\\.c,packet_send\\.c" },
+
+ /* All basic stuff from silcd/ */
+ { 10, "silc_server_*" },
/* All from silcd/ */
- { 10, "*silcd*,*serverid*,silc_server_*,*idlist*" },
+ { 15, "*silcd*,*serverid*,silc_server_*,*idlist*" },
/* All from silcd/ and basic stuff from libs */
- { 15, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,*silcske*" },
+ { 20, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,*silcske*" },
/* All from silcd/ and more stuff from libs */
- { 20, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
+ { 25, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
"*silcpacket*,*ske*,*silcrng*" },
/* All from silcd/ and even more stuff from libs */
- { 25, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
+ { 30, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
"*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*" },
/* All from silcd/ and even more stuff from libs + all from silccore */
- { 30, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
+ { 35, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
"*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*"
"*silcid*,*argument*" },
/* All from silcd/, all from silccore, silccrypt and silcmath */
- { 35, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
+ { 40, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
"*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*"
"*silcid*,*argument*,*pkcs*,*hmac*,*hash*,*cipher*,silc_math*" },
/* All from silcd/, all from silccore, silccrypt and silcmath + stuff
from silcutil */
- { 40, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
+ { 45, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
"*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*"
"*silcid*,*argument*,*pkcs*,*hmac*,*hash*,*cipher*,silc_math*,*sim*"
"*sockconn*" },
/* All from silcd/, all from silccore, silccrypt and silcmath + more stuff
from silcutil */
- { 45, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
+ { 50, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
"*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*"
"*silcid*,*argument*,*pkcs*,*hmac*,*hash*,*cipher*,silc_math*,*sim*"
"*sockconn*,*net*" },
/* All from silcd/, all from silccore, silccrypt and silcmath + more stuff
from silcutil */
- { 50, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
+ { 55, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,"
"*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*"
"*silcid*,*argument*,*pkcs*,*hmac*,*hash*,*cipher*,silc_math*,*sim*"
"*sockconn*,*net*,*log*,*config*" },
}
}
-/* This function should not be called directly but throught the wrapper
+/* This function should not be called directly but thru the wrapper
macro SILC_SERVER_LOG_STDERR() */
void silc_server_stderr(char *message)
{
- if (silcd->background)
+ if (silcd->background) {
+ char *p, *n = message;
+
+ /* remove newlines if we are going to output it to a log file */
+ for (p = n; *p; p++) {
+ if (*p != '\n') {
+ if (p != n)
+ *n = *p;
+ n++;
+ }
+ }
+ *n = 0;
+
silc_log_output(SILC_LOG_ERROR, message);
+ }
else {
- fprintf(stderr, "%s", message);
+ fprintf(stderr, "%s\n", message);
silc_free(message);
}
}
if (opt_create_keypair == TRUE) {
/* Create new key pair and exit */
+ char pubfile[256], prvfile[256];
+
+ memset(pubfile, 0, sizeof(pubfile));
+ memset(prvfile, 0, sizeof(prvfile));
+ snprintf(pubfile, sizeof(pubfile) - 1, "%s/silcd.pub", opt_keypath);
+ snprintf(prvfile, sizeof(prvfile) - 1, "%s/silcd.prv", opt_keypath);
+
silc_cipher_register_default();
silc_pkcs_register_default();
silc_hash_register_default();
silc_hmac_register_default();
- silc_server_create_key_pair(opt_pkcs, opt_bits, opt_keypath,
- opt_identifier, NULL, NULL);
+ silc_create_key_pair(opt_pkcs, opt_bits, pubfile, prvfile,
+ opt_identifier, "", NULL, NULL, NULL, FALSE);
exit(0);
}
if (ret == FALSE)
goto fail;
+ /* Register default crypto stuff since we are going to need them
+ in the configuration file parsing phase */
+ silc_cipher_register_default();
+ silc_pkcs_register_default();
+ silc_hash_register_default();
+ silc_hmac_register_default();
+
/* Read configuration files */
silcd->config = silc_server_config_alloc(silcd_config_file);
if (silcd->config == NULL)
goto fail;
silcd->config_file = silcd_config_file;
+ /* Unregister the default crypto stuff so that configuration takes effect */
+ silc_cipher_unregister_all();
+ silc_pkcs_unregister_all();
+ silc_hash_unregister_all();
+ silc_hmac_unregister_all();
+
/* Check for another silcd running */
silc_server_checkpid(silcd);
silc_free(opt_keypath);
exit(1);
}
-
-/* Returns identifier string for public key generation. */
-
-static char *silc_server_create_identifier(void)
-{
- char *username = NULL, *realname = NULL;
- char hostname[256], email[256];
-
- /* Get realname */
- realname = silc_get_real_name();
-
- /* Get hostname */
- memset(hostname, 0, sizeof(hostname));
- gethostname(hostname, sizeof(hostname));
-
- /* Get username (mandatory) */
- username = silc_get_username();
- if (!username)
- return NULL;
-
- /* Create default email address, whether it is right or not */
- snprintf(email, sizeof(email), "%s@%s", username, hostname);
-
- return silc_pkcs_encode_identifier(username, hostname, realname, email,
- NULL, NULL);
-}
-
-/* Creates new public key and private key pair. This is used only
- when user wants to create new key pair from command line. */
-
-static int
-silc_server_create_key_pair(char *pkcs_name, int bits, char *path,
- char *identifier,
- SilcPublicKey *ret_pub_key,
- SilcPrivateKey *ret_prv_key)
-{
- SilcPKCS pkcs;
- SilcPublicKey pub_key;
- SilcPrivateKey prv_key;
- SilcRng rng;
- unsigned char *key;
- SilcUInt32 key_len;
- char pkfile[256], prvfile[256];
-
- if (!pkcs_name || !path)
- return FALSE;
-
- if (!silc_pkcs_is_supported(pkcs_name)) {
- fprintf(stderr, "Unsupported PKCS `%s'", pkcs_name);
- return FALSE;
- }
-
- if (!bits)
- bits = 2048;
-
- if (!identifier)
- identifier = silc_server_create_identifier();
-
- rng = silc_rng_alloc();
- silc_rng_init(rng);
- silc_rng_global_init(rng);
-
- snprintf(pkfile, sizeof(pkfile) - 1, "%s%s", path,
- SILC_SERVER_PUBLIC_KEY_NAME);
- snprintf(prvfile, sizeof(prvfile) - 1, "%s%s", path,
- SILC_SERVER_PRIVATE_KEY_NAME);
-
- /* Generate keys */
- silc_pkcs_alloc(pkcs_name, &pkcs);
- silc_pkcs_generate_key(pkcs, bits, rng);
-
- /* Save public key into file */
- key = silc_pkcs_get_public_key(pkcs, &key_len);
- pub_key = silc_pkcs_public_key_alloc(silc_pkcs_get_name(pkcs), identifier,
- key, key_len);
- silc_pkcs_save_public_key(pkfile, pub_key, SILC_PKCS_FILE_PEM);
- if (ret_pub_key)
- *ret_pub_key = pub_key;
- else
- silc_pkcs_public_key_free(pub_key);
-
- memset(key, 0, sizeof(key_len));
- silc_free(key);
-
- /* Save private key into file */
- key = silc_pkcs_get_private_key(pkcs, &key_len);
- prv_key = silc_pkcs_private_key_alloc(silc_pkcs_get_name(pkcs),
- key, key_len);
- silc_pkcs_save_private_key(prvfile, prv_key, NULL, SILC_PKCS_FILE_BIN);
- if (ret_prv_key)
- *ret_prv_key = prv_key;
- else
- silc_pkcs_private_key_free(prv_key);
-
- printf("Public key has been saved into `%s'\n", pkfile);
- printf("Private key has been saved into `%s'\n", prvfile);
-
- memset(key, 0, sizeof(key_len));
- silc_free(key);
-
- silc_rng_free(rng);
- silc_pkcs_free(pkcs);
-
- return TRUE;
-}