Statistics
| Branch: | Revision:

iof-bird / bird-2.0.1 / proto / rpki / ssh_transport.c @ 6b3f1a54

History | View | Annotate | Download (1.93 KB)

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
}