X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilc%2Fsilc.c;h=e449af1d89883c03da6294b2bcbcd146017e7f21;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=fa67c0839d7b1bf270cc4cde72ded6935b895758;hpb=72cfa31520ebc0058763a30e21c13f6e9a964aa0;p=silc.git diff --git a/apps/silc/silc.c b/apps/silc/silc.c index fa67c083..e449af1d 100644 --- a/apps/silc/silc.c +++ b/apps/silc/silc.c @@ -59,6 +59,7 @@ static struct option long_opts[] = { "create-key-pair", 0, NULL, 'C' }, { "pkcs", 1, NULL, 10 }, { "bits", 1, NULL, 11 }, + { "show-key", 1, NULL, 'S' }, { NULL, 0, NULL, 0 } }; @@ -72,10 +73,12 @@ static char *opt_cipher = NULL; static char *opt_public_key = NULL; static char *opt_private_key = NULL; static char *opt_config_file = NULL; -static int opt_no_silcrc = FALSE; +static bool opt_no_silcrc = FALSE; -static int opt_create_keypair = FALSE; +static bool opt_create_keypair = FALSE; +static bool opt_show_key = FALSE; static char *opt_pkcs = NULL; +static char *opt_keyfile = NULL; static int opt_bits = 0; /* SILC Client operations */ @@ -109,6 +112,7 @@ Usage: silc [options]\n\ -C, --create-key-pair Create new public key pair\n\ --pkcs=PKCS Set the PKCS of the public key pair\n\ --bits=VALUE Set length of the public key pair\n\ + -S, --show-key=FILE Show the contents of the public key\n\ \n"); } @@ -125,7 +129,7 @@ int main(int argc, char **argv) { while ((opt = getopt_long(argc, argv, - "s:p:n:c:b:k:f:qdhVC", + "s:p:n:c:b:k:f:qdhVCS:", long_opts, &option_index)) != EOF) { switch(opt) @@ -210,6 +214,11 @@ SILC Secure Internet Live Conferencing, version %s\n", if (optarg) opt_bits = atoi(optarg); break; + case 'S': + opt_show_key = TRUE; + if (optarg) + opt_keyfile = strdup(optarg); + break; default: exit(0); @@ -237,8 +246,24 @@ SILC Secure Internet Live Conferencing, version %s\n", if (opt_create_keypair == TRUE) { /* Create new key pair and exit */ + silc_cipher_register_default(); + silc_pkcs_register_default(); + silc_hash_register_default(); + silc_hmac_register_default(); silc_client_create_key_pair(opt_pkcs, opt_bits, NULL, NULL, NULL, NULL, NULL); + silc_free(opt_pkcs); + exit(0); + } + + if (opt_show_key == TRUE) { + /* Dump the key */ + silc_cipher_register_default(); + silc_pkcs_register_default(); + silc_hash_register_default(); + silc_hmac_register_default(); + silc_client_show_key(opt_keyfile); + silc_free(opt_keyfile); exit(0); } @@ -250,32 +275,42 @@ SILC Secure Internet Live Conferencing, version %s\n", app = silc_calloc(1, sizeof(*app)); /* Allocate new client */ - app->client = silc = silc_client_alloc(&ops, app); + app->client = silc = silc_client_alloc(&ops, app, silc_version_string); if (!silc) goto fail; /* Read global configuration file. */ app->config = silc_client_config_alloc(opt_config_file); - if (app->config == NULL) - goto fail; /* XXX Read local configuration file */ - /* Check ~/.silc directory and public and private keys */ - if (silc_client_check_silc_dir() == FALSE) - goto fail; - /* Get user information */ silc->username = silc_get_username(); silc->hostname = silc_net_localhost(); silc->realname = silc_get_real_name(); /* Register all configured ciphers, PKCS and hash functions. */ - app->config->client = (void *)app; - silc_client_config_register_ciphers(app->config); - silc_client_config_register_pkcs(app->config); - silc_client_config_register_hashfuncs(app->config); - silc_client_config_register_hmacs(app->config); + if (app->config) { + app->config->client = (void *)app; + if (!silc_client_config_register_ciphers(app->config)) + silc_cipher_register_default(); + if (!silc_client_config_register_pkcs(app->config)) + silc_pkcs_register_default(); + if (!silc_client_config_register_hashfuncs(app->config)) + silc_hash_register_default(); + if (!silc_client_config_register_hmacs(app->config)) + silc_hmac_register_default(); + } else { + /* Register default ciphers, pkcs, hash funtions and hmacs. */ + silc_cipher_register_default(); + silc_pkcs_register_default(); + silc_hash_register_default(); + silc_hmac_register_default(); + } + + /* Check ~/.silc directory and public and private keys */ + if (silc_client_check_silc_dir() == FALSE) + goto fail; /* Load public and private key */ if (silc_client_load_keys(silc) == FALSE) @@ -303,7 +338,7 @@ SILC Secure Internet Live Conferencing, version %s\n", SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW); - if (app->config->commands) { + if (app->config && app->config->commands) { /* Run user configured commands with timeout */ silc_task_register(silc->timeout_queue, 0, silc_client_run_commands, @@ -514,7 +549,7 @@ static void silc_client_clear_input(SilcClientInternal app) static void silc_client_process_message(SilcClientInternal app) { unsigned char *data; - uint32 len; + SilcUInt32 len; SILC_LOG_DEBUG(("Start")); @@ -523,9 +558,9 @@ static void silc_client_process_message(SilcClientInternal app) if (data[0] == '/' && data[1] != ' ') { /* Command */ - uint32 argc = 0; + SilcUInt32 argc = 0; unsigned char **argv, *tmpcmd; - uint32 *argv_lens, *argv_types; + SilcUInt32 *argv_lens, *argv_types; SilcClientCommand *cmd; SilcClientCommandContext ctx; @@ -623,9 +658,9 @@ SILC_TASK_CALLBACK(silc_client_run_commands) cs = app->config->commands; while(cs) { - uint32 argc = 0; + SilcUInt32 argc = 0; unsigned char **argv, *tmpcmd; - uint32 *argv_lens, *argv_types; + SilcUInt32 *argv_lens, *argv_types; SilcClientCommand *cmd; SilcClientCommandContext ctx;