diff --git a/src/abstract_crypto.h b/src/abstract_crypto.h index 031b1c0861546f6996565ad371ffbd8e1556bc6d..23c511a1fd24108900e51a84dc0690828f43c073 100644 --- a/src/abstract_crypto.h +++ b/src/abstract_crypto.h @@ -133,4 +133,10 @@ struct signature_algorithm UINT8 *public); }; +#define MAKE_SIGNER(a, pl, p, sl, s) \ +((a)->make_signer((a), (pl), (p), (sl), (s))) + +#define MAKE_VERIFIER(a, pl, p) \ +((a)->make_verifier((a), (pl), (p))) + #endif /* LSH_ABSTRACT_CRYPTO_H_INCLUDED */ diff --git a/src/lshd.c b/src/lshd.c index cee9ff4780903deee4125fa851973fab4090570a..b047f7ce112dbdcfee49698c7f533d08fcc8ec67 100644 --- a/src/lshd.c +++ b/src/lshd.c @@ -46,6 +46,64 @@ void usage() exit(1); } +struct signer *secret_key; +struct lsh_string *public_key; + +/* A key generated by gnupg */ +void init_host_key(struct randomness *r) +{ + mpz_t p, q, g, y, a; + mpz_t tmp; + lsh_string *s; + + mpz_init_set_str(p, + "BC7797D55CF2449CA4B02396246AF5C75CA38C52B6F2E543" + "6754198B137B25B0A81DFE269D5CDFD0AEA290A32BA5B918" + "B58D64762D40EAA8D70F282B3AC4A7771171B1B1D1AE89F4" + "1CD091FE95A6F42A2340081F9E97A4B5F953DE223F10F878" + "4C0619A9979643E5325DF71C9C088F3BC82FA0A6C47B5C64" + "BC07A31B9CDB2B07", §6); + mpz_init_set_str(q, + "867F7E6563B3FAF19B65C83E9B843150C5CC2201", 16); + mpz_init_set_str(g, + "7FA83EAEDFD8679A4A80C869AD7E353F3B517569C2079C79" + "97EA6655764581B073F71AA15C07A789AEB213B106741AAB" + "CA81B8300B1F8510D3CD1C3D9D7D11640C1608E8E2E71527" + "68B8FDCB5544E29A020D14CC5C12E264C59E57E9F6832DA7" + "10B805CD9866C1110D60069D31D5A72D1A1ED96F2B11CFEF" + "7AB347F0632CB0C7", 16); + mpz_init_set_str(y, + "2DA5B458DF3616097FA22DB6BDDD31A29E532054D4C208F7" + "EBF63EB2476E8E98E0885CFBC5669B56EC834E42058E8BCF" + "C259CA1BE981D7721306709499DE27E7B13F62359D9520D1" + "3D73C62E8E5C5F6B8E2C70217EC3B557FBCB98535BE3C6EE" + "0C71DEC1FE9C6791D3780DD8D593D5030969D303A5818B01" + "C4B855C07E8C4F64", 16); + mpz_set_str(a, + "295190AEDBBD6EBD2F817F7D8CCC8B0095DCD82E", 16); + + mpz_init_set(tmp, g); + mpz_powm(tmp, tmp, a, p); + if (mpz_cmp(tmp, y)) + fatal("Test key invalid\n"); + + mpz_clear(tmp); + + public_key = ssh_format("%a%n%n%n%n", ATOM_SSH_DSS, p, q, g, y); + s = ssh_format("%n", a); + + secret_key = MAKE_SIGNER(make_dss_algorithm(r), + public_key->length, public_key->data, + s->length, s->data); + + lsh_free(s); + mpz_clear(p); + mpz_clear(q); + mpz_clear(g); + mpz_clear(y); + mpz_clear(a); +} + int main(int argc, char **argv) { char *host = NULL; /* Interface to bind */ @@ -91,7 +149,7 @@ int main(int argc, char **argv) if (!io_listen(&backend, &local, make_server_callback(&backend, - "lsh - a free ssh", + "lshd - a free ssh", BLOCK_SIZE))) { werror("lsh: Connection failed: %s\n", strerror(errno)); diff --git a/src/publickey_crypto.c b/src/publickey_crypto.c index b7258ec2c769bf0704fb7803a9b08c7f43e8152e..a09c449004ae0fca9c322648ca1ae2b79e86c1b7 100644 --- a/src/publickey_crypto.c +++ b/src/publickey_crypto.c @@ -130,6 +130,12 @@ static struct lsh_string *do_dss_sign(struct signer *c, return signature; } +static struct lsh_string *dss_public_key(struct signer *dss) +{ + struct + return ssh_format("%a%n%n%n%n", ATOM_SSH_DSS, dss->p, dss->q, dss->g, dss->y); +} + int do_dss_verify(struct verifier *c, UINT32 length, UINT8 *msg, @@ -571,3 +577,4 @@ int dh_verify_server_msg(struct diffie_hellman_instance *self, return VERIFY(v, self->hash->hash_size, digest, self->signature->length, self->signature->data); } + diff --git a/src/server.c b/src/server.c index e30728b80739c97bbd217008300ea36d6cb3d84c..18319414f10162e0f5bf7557486730251f565bd4 100644 --- a/src/server.c +++ b/src/server.c @@ -132,7 +132,10 @@ struct read_handler *make_server_read_line(struct ssh_connection *s) struct fd_callback *make_server_callback(struct io_backend *b, char *comment, - UINT32 block_size) + UINT32 block_size, + struct signer *secret, + struct lsh_string *host_key, + struct randomness *r) { struct server_callback *connected = xalloc(sizeof(struct server_callback)); @@ -141,6 +144,9 @@ struct fd_callback *make_server_callback(struct io_backend *b, connected->backend = b; connected->block_size = block_size; connected->id_comment = comment; + connected->secret = secret; + connected->host_key = host_key; + connected->random = r; return &connected->super; } diff --git a/src/server.h b/src/server.h index 6b0697360e3c88003a946adc6895c55b452bcff7..820ffd1b3daf9ca6ed3c9cee20dac94f812ed393 100644 --- a/src/server.h +++ b/src/server.h @@ -32,6 +32,10 @@ struct server_callback { struct fd_callback super; struct io_backend *backend; + + struct signer *secret; /* secret key */ + struct lsh_string *host_key; /* public key */ + struct randomness *random; UINT32 block_size; char *id_comment; };