aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2018-04-16 20:26:20 +0200
committerToni Uhlig <matzeton@googlemail.com>2018-04-16 20:26:20 +0200
commit569822351975d6cba017651e3a6d7d99a32a02f7 (patch)
treef83e6a55b44f8ba8d0c1e1cf2f50cbc864205b66
parentc9b3ea785346546948afcf685c80c460f3b1317a (diff)
POTD skeleton #11.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
-rw-r--r--src/server.c3
-rw-r--r--src/server_ssh.c57
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;
}