Return to ssh_transport.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird2 / proto / rpki |
1.1 ! misho 1: /* ! 2: * BIRD -- An implementation of the SSH protocol for the RPKI transport ! 3: * ! 4: * (c) 2015 CZ.NIC ! 5: * (c) 2015 Pavel Tvrdik <pawel.tvrdik@gmail.com> ! 6: * ! 7: * This file was a part of RTRlib: http://rpki.realmv6.org/ ! 8: * This transport implementation uses libssh (http://www.libssh.org/) ! 9: * ! 10: * Can be freely distributed and used under the terms of the GNU GPL. ! 11: */ ! 12: ! 13: #include <stdio.h> ! 14: #include <stdlib.h> ! 15: #include <string.h> ! 16: #include <sys/time.h> ! 17: ! 18: #include "rpki.h" ! 19: ! 20: static int ! 21: rpki_tr_ssh_open(struct rpki_tr_sock *tr) ! 22: { ! 23: struct rpki_cache *cache = tr->cache; ! 24: struct rpki_config *cf = (void *) cache->p->p.cf; ! 25: struct rpki_tr_ssh_config *ssh_cf = (void *) cf->tr_config.spec; ! 26: sock *sk = tr->sk; ! 27: ! 28: sk->type = SK_SSH_ACTIVE; ! 29: sk->ssh = mb_allocz(sk->pool, sizeof(struct ssh_sock)); ! 30: sk->ssh->username = ssh_cf->user; ! 31: sk->ssh->client_privkey_path = ssh_cf->bird_private_key; ! 32: sk->ssh->server_hostkey_path = ssh_cf->cache_public_key; ! 33: sk->ssh->subsystem = "rpki-rtr"; ! 34: sk->ssh->state = SK_SSH_CONNECT; ! 35: ! 36: if (sk_open(sk) != 0) ! 37: return RPKI_TR_ERROR; ! 38: ! 39: return RPKI_TR_SUCCESS; ! 40: } ! 41: ! 42: static const char * ! 43: rpki_tr_ssh_ident(struct rpki_tr_sock *tr) ! 44: { ! 45: struct rpki_cache *cache = tr->cache; ! 46: struct rpki_config *cf = (void *) cache->p->p.cf; ! 47: struct rpki_tr_ssh_config *ssh_cf = (void *) cf->tr_config.spec; ! 48: ! 49: if (tr->ident != NULL) ! 50: return tr->ident; ! 51: ! 52: const char *username = ssh_cf->user; ! 53: const char *host = cf->hostname; ! 54: u16 port = cf->port; ! 55: ! 56: size_t len = strlen(username) + 1 + strlen(host) + 1 + 5 + 1; /* <user> + '@' + <host> + ':' + <port> + '\0' */ ! 57: char *ident = mb_alloc(cache->pool, len); ! 58: bsnprintf(ident, len, "%s@%s:%u", username, host, port); ! 59: tr->ident = ident; ! 60: ! 61: return tr->ident; ! 62: } ! 63: ! 64: /** ! 65: * rpki_tr_ssh_init - initializes the RPKI transport structure for a SSH connection ! 66: * @tr: allocated RPKI transport structure ! 67: */ ! 68: void ! 69: rpki_tr_ssh_init(struct rpki_tr_sock *tr) ! 70: { ! 71: tr->open_fp = &rpki_tr_ssh_open; ! 72: tr->ident_fp = &rpki_tr_ssh_ident; ! 73: }