+#ifdef SILC_PLUGIN
+ char *endptr, *pkcs=NULL;
+ long int val;
+ int bits=0;
+ CREATE_KEY_REC *rec;
+
+ if ((argc == 3) || (argc == 5))
+ goto err;
+
+ for (i=2; i<argc-1; i+=2)
+ if (strcasecmp(argv[i], "-pkcs") == 0) {
+ if (pkcs == NULL)
+ pkcs = argv[i+1];
+ else
+ goto err;
+ } else if (strcasecmp(argv[i], "-bits") == 0) {
+ if (bits == 0) {
+ val = strtol(argv[i+1], &endptr, 10);
+ if ((*endptr != '\0') || (val <= 0) || (val >= INT_MAX))
+ goto err;
+ bits = val;
+ } else
+ goto err;
+ } else
+ goto err;
+
+ rec = g_new0(CREATE_KEY_REC, 1);
+ rec->pkcs = (pkcs == NULL ? NULL : g_strdup(pkcs));
+ rec->bits = bits;
+
+ keyboard_entry_redirect((SIGNAL_FUNC) create_key_passphrase,
+ format_get_text("fe-common/silc", NULL, NULL,
+ NULL, SILCTXT_CONFIG_PASS_ASK2),
+ ENTRY_REDIRECT_FLAG_HIDDEN, rec);
+ printformat_module("fe-common/silc", NULL, NULL,
+ MSGLEVEL_CRAP, SILCTXT_CONFIG_NEXTTIME);
+ goto out;
+#else
+ silc_cipher_register_default();
+ silc_pkcs_register_default();
+ silc_hash_register_default();
+ silc_hmac_register_default();
+ silc_create_key_pair(opt_pkcs, opt_bits, NULL, NULL,
+ NULL, NULL, NULL, NULL, TRUE);
+ exit(0);
+#endif
+ }
+
+#ifdef SILC_PLUGIN
+ if ((argc < 4) && (strcasecmp(argv[1], "passphrase-change") == 0)) {
+#else
+ if (strcmp(opt->longName, "passphrase-change") == 0) {
+#endif
+ /* Change the passphrase of the private key file */
+#ifdef SILC_PLUGIN
+ CREATE_KEY_REC *rec;
+
+ rec = g_new0(CREATE_KEY_REC, 1);
+ rec->file = g_strdup((argc == 3 ? argv[2] : privkey));
+
+ keyboard_entry_redirect((SIGNAL_FUNC) change_private_key_passphrase,
+ format_get_text("fe-common/silc", NULL, NULL,
+ NULL, SILCTXT_CONFIG_PASS_ASK1),
+ ENTRY_REDIRECT_FLAG_HIDDEN, rec);
+ goto out;
+#else