+
+#ifdef SILC_PLUGIN
+void create_key_passphrase(const char *answer, CREATE_KEY_REC *rec)
+{
+ char priv_key_file[128], pub_key_file[128];
+
+ signal_stop();
+
+ if ((rec->passphrase == NULL) && (answer) && (*answer != '\0')) {
+ rec->passphrase = g_strdup(answer);
+ 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);
+ return;
+ }
+
+ if ((answer) && (*answer != '\0') && (rec->passphrase != NULL)) {
+ if (strcmp(answer, rec->passphrase)) {
+ printformat_module("fe-common/silc", NULL, NULL,
+ MSGLEVEL_CRAP, SILCTXT_CONFIG_PASSMISMATCH);
+ g_free(rec->pkcs);
+ g_free(rec->passphrase);
+ g_free(rec);
+ return;
+ }
+ }
+
+ memset(priv_key_file, 0, sizeof(priv_key_file));
+ memset(pub_key_file, 0, sizeof(pub_key_file));
+ snprintf(priv_key_file, sizeof(priv_key_file) - 1, "%s/%s",
+ get_irssi_dir(), SILC_CLIENT_PRIVATE_KEY_NAME);
+ snprintf(pub_key_file, sizeof(pub_key_file) - 1, "%s/%s",
+ get_irssi_dir(), SILC_CLIENT_PUBLIC_KEY_NAME);
+
+ if (silc_create_key_pair(rec->pkcs, rec->bits, pub_key_file, priv_key_file,
+ NULL, (rec->passphrase == NULL ? "" : rec->passphrase),
+ NULL, NULL, NULL, FALSE) == TRUE)
+ printformat_module("fe-common/silc", NULL, NULL,
+ MSGLEVEL_CRAP, SILCTXT_CONFIG_CREATE);
+ else
+ printformat_module("fe-common/silc", NULL, NULL,
+ MSGLEVEL_CRAP, SILCTXT_CONFIG_CREATE_FAIL);
+
+ g_free(rec->passphrase);
+ g_free(rec->pkcs);
+ g_free(rec);
+
+}
+
+void change_private_key_passphrase(const char *answer, CREATE_KEY_REC *rec)
+{
+ signal_stop();
+
+ if (rec->old == NULL) {
+ rec->old = g_strdup((answer == NULL ? "" : answer));
+ keyboard_entry_redirect((SIGNAL_FUNC) change_private_key_passphrase,
+ format_get_text("fe-common/silc", NULL, NULL,
+ NULL, SILCTXT_CONFIG_PASS_ASK2),
+ ENTRY_REDIRECT_FLAG_HIDDEN, rec);
+ return;
+ }
+
+ if ((rec->passphrase == NULL) && (answer) && (*answer != '\0')) {
+ rec->passphrase = g_strdup(answer);
+ keyboard_entry_redirect((SIGNAL_FUNC) change_private_key_passphrase,
+ format_get_text("fe-common/silc", NULL, NULL,
+ NULL, SILCTXT_CONFIG_PASS_ASK3),
+ ENTRY_REDIRECT_FLAG_HIDDEN, rec);
+ return;
+ }
+
+ if ((answer) && (*answer != '\0') && (rec->passphrase != NULL)) {
+ if (strcmp(answer, rec->passphrase)) {
+ printformat_module("fe-common/silc", NULL, NULL,
+ MSGLEVEL_CRAP, SILCTXT_CONFIG_PASSMISMATCH);
+ g_free(rec->old);
+ g_free(rec->file);
+ g_free(rec->pkcs);
+ g_free(rec->passphrase);
+ g_free(rec);
+ return;
+ }
+ }
+
+ if (silc_change_private_key_passphrase(rec->file, rec->old,
+ (rec->passphrase == NULL ?
+ "" : rec->passphrase)) == TRUE)
+ printformat_module("fe-common/silc", NULL, NULL,
+ MSGLEVEL_CRAP, SILCTXT_CONFIG_PASSCHANGE);
+ else
+ printformat_module("fe-common/silc", NULL, NULL,
+ MSGLEVEL_CRAP, SILCTXT_CONFIG_PASSCHANGE_FAIL);
+ g_free(rec->old);
+ g_free(rec->file);
+ g_free(rec->passphrase);
+ g_free(rec->pkcs);
+ g_free(rec);
+
+}
+#endif