diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server.c | 3 | ||||
-rw-r--r-- | src/server_ssh.c | 57 |
2 files changed, 59 insertions, 1 deletions
diff --git a/src/server.c b/src/server.c index 01ad6c9..d7e024b 100644 --- a/src/server.c +++ b/src/server.c @@ -46,7 +46,8 @@ int server_setup(server_ctx *ctx, assert(ctx); assert(listen_addr || listen_port); - D2("Try to listen on %s:%s", listen_addr, listen_port); + D2("Try to listen on %s:%s", + (listen_addr ? listen_addr : "*"), listen_port); s = socket_init_in(listen_addr, listen_port, &srv_addr); if (s) { E_GAIERR(s, "Could not initialise server socket"); diff --git a/src/server_ssh.c b/src/server_ssh.c index 219866b..5c9e1cb 100644 --- a/src/server_ssh.c +++ b/src/server_ssh.c @@ -18,6 +18,8 @@ struct fwd_callbacks potd_ssh_callbacks = { static int set_default_keys(ssh_bind sshbind, int rsa_already_set, int dsa_already_set, int ecdsa_already_set); +static int gen_default_keys(void); +static int gen_export_sshkey(enum ssh_keytypes_e type, int length, const char *path); int ssh_init_cb(struct forward_ctx *ctx) @@ -33,6 +35,8 @@ int ssh_init_cb(struct forward_ctx *ctx) ctx->data = d; if (!d->sshbind || !d->session) return 1; + if (gen_default_keys()) + return 1; if (set_default_keys(d->sshbind, 0, 0, 0)) return 1; @@ -46,6 +50,7 @@ int ssh_on_listen(struct forward_ctx *ctx) if (ssh_bind_listen(d->sshbind) < 0) { E("Error listening to SSH socket: %s", ssh_get_error(d->sshbind)); } + return 0; } @@ -72,5 +77,57 @@ static int set_default_keys(ssh_bind sshbind, int rsa_already_set, "./ssh_host_ecdsa_key")) return 1; } + + return 0; +} + +static int gen_default_keys(void) +{ + if (gen_export_sshkey(SSH_KEYTYPE_DSS, 1024, "./ssh_host_dsa_key")) + return 1; + if (gen_export_sshkey(SSH_KEYTYPE_RSA, 1024, "./ssh_host_rsa_key")) + return 1; + if (gen_export_sshkey(SSH_KEYTYPE_ECDSA, 1024, "./ssh_host_ecdsa_key")) + return 1; + return 0; +} + +static int gen_export_sshkey(enum ssh_keytypes_e type, int length, const char *path) +{ + ssh_key priv_key; + const char *type_str = NULL; + + assert(path); + assert(length == 1024 || length == 2048 || + length == 4096); + + switch (type) { + case SSH_KEYTYPE_DSS: + type_str = "DSS"; + break; + case SSH_KEYTYPE_RSA: + type_str = "RSA"; + break; + case SSH_KEYTYPE_ECDSA: + type_str = "ECDSA"; + break; + default: + return 1; + } + N2("Generating %s key with length %d bits and save it on disk: %s", + type_str, length, path); + if (ssh_pki_generate(type, length, &priv_key) != SSH_OK) { + E2("Generating %s key failed", type_str); + return 1; + } + errno = 0; + if (ssh_pki_export_privkey_file(priv_key, NULL, NULL, + NULL, path) != SSH_OK) + { + E_STRERR("SSH export to file"); + return 1; + } + ssh_key_free(priv_key); + return 0; } |