Blame src/legacy.c

Packit 6c0a39
/*
Packit 6c0a39
 * This file is part of the SSH Library
Packit 6c0a39
 *
Packit 6c0a39
 * Copyright (c) 2010 by Aris Adamantiadis
Packit 6c0a39
 *
Packit 6c0a39
 * The SSH Library is free software; you can redistribute it and/or modify
Packit 6c0a39
 * it under the terms of the GNU Lesser General Public License as published by
Packit 6c0a39
 * the Free Software Foundation; either version 2.1 of the License, or (at your
Packit 6c0a39
 * option) any later version.
Packit 6c0a39
 *
Packit 6c0a39
 * The SSH Library is distributed in the hope that it will be useful, but
Packit 6c0a39
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 6c0a39
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
Packit 6c0a39
 * License for more details.
Packit 6c0a39
 *
Packit 6c0a39
 * You should have received a copy of the GNU Lesser General Public License
Packit 6c0a39
 * along with the SSH Library; see the file COPYING.  If not, write to
Packit 6c0a39
 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
Packit 6c0a39
 * MA 02111-1307, USA.
Packit 6c0a39
 */
Packit 6c0a39
Packit 6c0a39
/** functions in that file are wrappers to the newly named functions. All
Packit 6c0a39
 * of them are depreciated, but these wrapper will avoid breaking backward
Packit 6c0a39
 * compatibility
Packit 6c0a39
 */
Packit 6c0a39
Packit 6c0a39
#include "config.h"
Packit 6c0a39
Packit 6c0a39
#include <errno.h>
Packit 6c0a39
#include <stdio.h>
Packit 6c0a39
Packit 6c0a39
#include <libssh/priv.h>
Packit 6c0a39
#include <libssh/session.h>
Packit 6c0a39
#include <libssh/server.h>
Packit 6c0a39
#include <libssh/buffer.h>
Packit 6c0a39
#include <libssh/dh.h>
Packit 6c0a39
#include <libssh/pki.h>
Packit 6c0a39
#include "libssh/pki_priv.h"
Packit 6c0a39
#include <libssh/misc.h>
Packit 6c0a39
#include <libssh/keys.h>
Packit 6c0a39
#include "libssh/options.h"
Packit 6c0a39
Packit 6c0a39
/* AUTH FUNCTIONS */
Packit 6c0a39
int ssh_auth_list(ssh_session session) {
Packit 6c0a39
  return ssh_userauth_list(session, NULL);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int ssh_userauth_offer_pubkey(ssh_session session, const char *username,
Packit 6c0a39
    int type, ssh_string publickey)
Packit 6c0a39
{
Packit 6c0a39
    ssh_key key;
Packit 6c0a39
    int rc;
Packit 6c0a39
Packit 6c0a39
    (void) type; /* unused */
Packit 6c0a39
Packit 6c0a39
    rc = ssh_pki_import_pubkey_blob(publickey, &key);
Packit 6c0a39
    if (rc < 0) {
Packit 6c0a39
        ssh_set_error(session, SSH_FATAL, "Failed to convert public key");
Packit 6c0a39
        return SSH_AUTH_ERROR;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    rc = ssh_userauth_try_publickey(session, username, key);
Packit 6c0a39
    ssh_key_free(key);
Packit 6c0a39
Packit 6c0a39
    return rc;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int ssh_userauth_pubkey(ssh_session session,
Packit 6c0a39
                        const char *username,
Packit 6c0a39
                        ssh_string publickey,
Packit 6c0a39
                        ssh_private_key privatekey)
Packit 6c0a39
{
Packit 6c0a39
    ssh_key key;
Packit 6c0a39
    int rc;
Packit 6c0a39
Packit 6c0a39
    (void) publickey; /* unused */
Packit 6c0a39
Packit 6c0a39
    key = ssh_key_new();
Packit 6c0a39
    if (key == NULL) {
Packit 6c0a39
        return SSH_AUTH_ERROR;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    key->type = privatekey->type;
Packit 6c0a39
    key->type_c = ssh_key_type_to_char(key->type);
Packit 6c0a39
    key->flags = SSH_KEY_FLAG_PRIVATE|SSH_KEY_FLAG_PUBLIC;
Packit 6c0a39
    key->dsa = privatekey->dsa_priv;
Packit 6c0a39
    key->rsa = privatekey->rsa_priv;
Packit 6c0a39
Packit 6c0a39
    rc = ssh_userauth_publickey(session, username, key);
Packit 6c0a39
    key->dsa = NULL;
Packit 6c0a39
    key->rsa = NULL;
Packit 6c0a39
    ssh_key_free(key);
Packit 6c0a39
Packit 6c0a39
    return rc;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int ssh_userauth_autopubkey(ssh_session session, const char *passphrase) {
Packit 6c0a39
    return ssh_userauth_publickey_auto(session, NULL, passphrase);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int ssh_userauth_privatekey_file(ssh_session session,
Packit 6c0a39
                                 const char *username,
Packit 6c0a39
                                 const char *filename,
Packit 6c0a39
                                 const char *passphrase) {
Packit 6c0a39
  char *pubkeyfile = NULL;
Packit 6c0a39
  ssh_string pubkey = NULL;
Packit 6c0a39
  ssh_private_key privkey = NULL;
Packit 6c0a39
  int type = 0;
Packit 6c0a39
  int rc = SSH_AUTH_ERROR;
Packit 6c0a39
  size_t klen = strlen(filename) + 4 + 1;
Packit 6c0a39
Packit 6c0a39
  pubkeyfile = malloc(klen);
Packit 6c0a39
  if (pubkeyfile == NULL) {
Packit 6c0a39
    ssh_set_error_oom(session);
Packit 6c0a39
Packit 6c0a39
    return SSH_AUTH_ERROR;
Packit 6c0a39
  }
Packit 6c0a39
  snprintf(pubkeyfile, klen, "%s.pub", filename);
Packit 6c0a39
Packit 6c0a39
  pubkey = publickey_from_file(session, pubkeyfile, &type);
Packit 6c0a39
  if (pubkey == NULL) {
Packit 6c0a39
    SSH_LOG(SSH_LOG_RARE, "Public key file %s not found. Trying to generate it.", pubkeyfile);
Packit 6c0a39
    /* auto-detect the key type with type=0 */
Packit 6c0a39
    privkey = privatekey_from_file(session, filename, 0, passphrase);
Packit 6c0a39
  } else {
Packit 6c0a39
    SSH_LOG(SSH_LOG_RARE, "Public key file %s loaded.", pubkeyfile);
Packit 6c0a39
    privkey = privatekey_from_file(session, filename, type, passphrase);
Packit 6c0a39
  }
Packit 6c0a39
  if (privkey == NULL) {
Packit 6c0a39
    goto error;
Packit 6c0a39
  }
Packit 6c0a39
  /* ssh_userauth_pubkey is responsible for taking care of null-pubkey */
Packit 6c0a39
  rc = ssh_userauth_pubkey(session, username, pubkey, privkey);
Packit 6c0a39
  privatekey_free(privkey);
Packit 6c0a39
Packit 6c0a39
error:
Packit 6c0a39
  SAFE_FREE(pubkeyfile);
Packit 6c0a39
  ssh_string_free(pubkey);
Packit 6c0a39
Packit 6c0a39
  return rc;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
/* BUFFER FUNCTIONS */
Packit 6c0a39
Packit 6c0a39
void buffer_free(ssh_buffer buffer){
Packit 6c0a39
  ssh_buffer_free(buffer);
Packit 6c0a39
}
Packit 6c0a39
void *buffer_get(ssh_buffer buffer){
Packit 6c0a39
  return ssh_buffer_get(buffer);
Packit 6c0a39
}
Packit 6c0a39
uint32_t buffer_get_len(ssh_buffer buffer){
Packit 6c0a39
  return ssh_buffer_get_len(buffer);
Packit 6c0a39
}
Packit 6c0a39
ssh_buffer buffer_new(void){
Packit 6c0a39
  return ssh_buffer_new();
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_channel channel_accept_x11(ssh_channel channel, int timeout_ms){
Packit 6c0a39
  return ssh_channel_accept_x11(channel, timeout_ms);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_change_pty_size(ssh_channel channel,int cols,int rows){
Packit 6c0a39
  return ssh_channel_change_pty_size(channel,cols,rows);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_channel channel_forward_accept(ssh_session session, int timeout_ms){
Packit 6c0a39
  return ssh_channel_accept_forward(session, timeout_ms, NULL);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_close(ssh_channel channel){
Packit 6c0a39
  return ssh_channel_close(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_forward_cancel(ssh_session session, const char *address, int port){
Packit 6c0a39
  return ssh_channel_cancel_forward(session, address, port);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_forward_listen(ssh_session session, const char *address,
Packit 6c0a39
    int port, int *bound_port){
Packit 6c0a39
  return ssh_channel_listen_forward(session, address, port, bound_port);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
void channel_free(ssh_channel channel){
Packit 6c0a39
  ssh_channel_free(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_get_exit_status(ssh_channel channel){
Packit 6c0a39
  return ssh_channel_get_exit_status(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_session channel_get_session(ssh_channel channel){
Packit 6c0a39
  return ssh_channel_get_session(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_is_closed(ssh_channel channel){
Packit 6c0a39
  return ssh_channel_is_closed(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_is_eof(ssh_channel channel){
Packit 6c0a39
  return ssh_channel_is_eof(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_is_open(ssh_channel channel){
Packit 6c0a39
  return ssh_channel_is_open(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_channel channel_new(ssh_session session){
Packit 6c0a39
  return ssh_channel_new(session);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_open_forward(ssh_channel channel, const char *remotehost,
Packit 6c0a39
    int remoteport, const char *sourcehost, int localport){
Packit 6c0a39
  return ssh_channel_open_forward(channel, remotehost, remoteport,
Packit 6c0a39
      sourcehost,localport);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_open_session(ssh_channel channel){
Packit 6c0a39
  return ssh_channel_open_session(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_poll(ssh_channel channel, int is_stderr){
Packit 6c0a39
  return ssh_channel_poll(channel, is_stderr);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_read(ssh_channel channel, void *dest, uint32_t count, int is_stderr){
Packit 6c0a39
  return ssh_channel_read(channel, dest, count, is_stderr);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
/*
Packit 6c0a39
 * This function will completely be depreciated. The old implementation was not
Packit 6c0a39
 * renamed.
Packit 6c0a39
 * int channel_read_buffer(ssh_channel channel, ssh_buffer buffer, uint32_t count,
Packit 6c0a39
 *   int is_stderr);
Packit 6c0a39
 */
Packit 6c0a39
Packit 6c0a39
int channel_read_nonblocking(ssh_channel channel, void *dest, uint32_t count,
Packit 6c0a39
    int is_stderr){
Packit 6c0a39
  return ssh_channel_read_nonblocking(channel, dest, count, is_stderr);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_request_env(ssh_channel channel, const char *name, const char *value){
Packit 6c0a39
  return ssh_channel_request_env(channel, name, value);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_request_exec(ssh_channel channel, const char *cmd){
Packit 6c0a39
  return ssh_channel_request_exec(channel, cmd);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_request_pty(ssh_channel channel){
Packit 6c0a39
  return ssh_channel_request_pty(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_request_pty_size(ssh_channel channel, const char *term,
Packit 6c0a39
    int cols, int rows){
Packit 6c0a39
  return ssh_channel_request_pty_size(channel, term, cols, rows);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_request_shell(ssh_channel channel){
Packit 6c0a39
  return ssh_channel_request_shell(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_request_send_signal(ssh_channel channel, const char *signum){
Packit 6c0a39
  return ssh_channel_request_send_signal(channel, signum);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_request_sftp(ssh_channel channel){
Packit 6c0a39
  return ssh_channel_request_sftp(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_request_subsystem(ssh_channel channel, const char *subsystem){
Packit 6c0a39
  return ssh_channel_request_subsystem(channel, subsystem);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_request_x11(ssh_channel channel, int single_connection, const char *protocol,
Packit 6c0a39
    const char *cookie, int screen_number){
Packit 6c0a39
  return ssh_channel_request_x11(channel, single_connection, protocol, cookie,
Packit 6c0a39
      screen_number);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_send_eof(ssh_channel channel){
Packit 6c0a39
  return ssh_channel_send_eof(channel);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_select(ssh_channel *readchans, ssh_channel *writechans, ssh_channel *exceptchans, struct
Packit 6c0a39
    timeval * timeout){
Packit 6c0a39
  return ssh_channel_select(readchans, writechans, exceptchans, timeout);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
void channel_set_blocking(ssh_channel channel, int blocking){
Packit 6c0a39
  ssh_channel_set_blocking(channel, blocking);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_write(ssh_channel channel, const void *data, uint32_t len){
Packit 6c0a39
  return ssh_channel_write(channel, data, len);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
/*
Packit 6c0a39
 * These functions have to be wrapped around the pki.c functions.
Packit 6c0a39
Packit 6c0a39
void privatekey_free(ssh_private_key prv);
Packit 6c0a39
ssh_private_key privatekey_from_file(ssh_session session, const char *filename,
Packit 6c0a39
    int type, const char *passphrase);
Packit 6c0a39
int ssh_publickey_to_file(ssh_session session, const char *file,
Packit 6c0a39
    ssh_string pubkey, int type);
Packit 6c0a39
ssh_string publickey_to_string(ssh_public_key key);
Packit 6c0a39
 *
Packit 6c0a39
 */
Packit 6c0a39
Packit 6c0a39
void string_burn(ssh_string str){
Packit 6c0a39
  ssh_string_burn(str);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_string string_copy(ssh_string str){
Packit 6c0a39
  return ssh_string_copy(str);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
void *string_data(ssh_string str){
Packit 6c0a39
  return ssh_string_data(str);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int string_fill(ssh_string str, const void *data, size_t len){
Packit 6c0a39
  return ssh_string_fill(str,data,len);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
void string_free(ssh_string str){
Packit 6c0a39
  ssh_string_free(str);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_string string_from_char(const char *what){
Packit 6c0a39
  return ssh_string_from_char(what);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
size_t string_len(ssh_string str){
Packit 6c0a39
  return ssh_string_len(str);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_string string_new(size_t size){
Packit 6c0a39
  return ssh_string_new(size);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
char *string_to_char(ssh_string str){
Packit 6c0a39
  return ssh_string_to_char(str);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
/* OLD PKI FUNCTIONS */
Packit 6c0a39
Packit 6c0a39
void publickey_free(ssh_public_key key) {
Packit 6c0a39
  if (key == NULL) {
Packit 6c0a39
    return;
Packit 6c0a39
  }
Packit 6c0a39
Packit 6c0a39
  switch(key->type) {
Packit 6c0a39
    case SSH_KEYTYPE_DSS:
Packit 6c0a39
#ifdef HAVE_LIBGCRYPT
Packit 6c0a39
      gcry_sexp_release(key->dsa_pub);
Packit Service fcc0d2
#elif defined HAVE_LIBCRYPTO
Packit 6c0a39
      DSA_free(key->dsa_pub);
Packit 6c0a39
#endif
Packit 6c0a39
      break;
Packit 6c0a39
    case SSH_KEYTYPE_RSA:
Packit 6c0a39
#ifdef HAVE_LIBGCRYPT
Packit 6c0a39
      gcry_sexp_release(key->rsa_pub);
Packit 6c0a39
#elif defined HAVE_LIBCRYPTO
Packit 6c0a39
      RSA_free(key->rsa_pub);
Packit 6c0a39
#elif defined HAVE_LIBMBEDCRYPTO
Packit 6c0a39
      mbedtls_pk_free(key->rsa_pub);
Packit 6c0a39
      SAFE_FREE(key->rsa_pub);
Packit 6c0a39
#endif
Packit 6c0a39
      break;
Packit 6c0a39
    default:
Packit 6c0a39
      break;
Packit 6c0a39
  }
Packit 6c0a39
  SAFE_FREE(key);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_public_key publickey_from_privatekey(ssh_private_key prv) {
Packit 6c0a39
    struct ssh_public_key_struct *p;
Packit 6c0a39
    ssh_key privkey;
Packit 6c0a39
    ssh_key pubkey;
Packit 6c0a39
    int rc;
Packit 6c0a39
Packit 6c0a39
    privkey = ssh_key_new();
Packit 6c0a39
    if (privkey == NULL) {
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    privkey->type = prv->type;
Packit 6c0a39
    privkey->type_c = ssh_key_type_to_char(privkey->type);
Packit 6c0a39
    privkey->flags = SSH_KEY_FLAG_PRIVATE | SSH_KEY_FLAG_PUBLIC;
Packit 6c0a39
    privkey->dsa = prv->dsa_priv;
Packit 6c0a39
    privkey->rsa = prv->rsa_priv;
Packit 6c0a39
Packit 6c0a39
    rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey);
Packit 6c0a39
    privkey->dsa = NULL;
Packit 6c0a39
    privkey->rsa = NULL;
Packit 6c0a39
    ssh_key_free(privkey);
Packit 6c0a39
    if (rc < 0) {
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    p = ssh_pki_convert_key_to_publickey(pubkey);
Packit 6c0a39
    ssh_key_free(pubkey);
Packit 6c0a39
Packit 6c0a39
    return p;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_private_key privatekey_from_file(ssh_session session,
Packit 6c0a39
                                     const char *filename,
Packit 6c0a39
                                     int type,
Packit 6c0a39
                                     const char *passphrase) {
Packit 6c0a39
    ssh_auth_callback auth_fn = NULL;
Packit 6c0a39
    void *auth_data = NULL;
Packit 6c0a39
    ssh_private_key privkey;
Packit 6c0a39
    ssh_key key;
Packit 6c0a39
    int rc;
Packit 6c0a39
Packit 6c0a39
    (void) type; /* unused */
Packit 6c0a39
Packit 6c0a39
    if (session->common.callbacks) {
Packit 6c0a39
        auth_fn = session->common.callbacks->auth_function;
Packit 6c0a39
        auth_data = session->common.callbacks->userdata;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
Packit 6c0a39
    rc = ssh_pki_import_privkey_file(filename,
Packit 6c0a39
                                     passphrase,
Packit 6c0a39
                                     auth_fn,
Packit 6c0a39
                                     auth_data,
Packit 6c0a39
                                     &key);
Packit 6c0a39
    if (rc == SSH_ERROR) {
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    privkey = malloc(sizeof(struct ssh_private_key_struct));
Packit 6c0a39
    if (privkey == NULL) {
Packit 6c0a39
        ssh_key_free(key);
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    privkey->type = key->type;
Packit 6c0a39
    privkey->dsa_priv = key->dsa;
Packit 6c0a39
    privkey->rsa_priv = key->rsa;
Packit 6c0a39
Packit 6c0a39
    key->dsa = NULL;
Packit 6c0a39
    key->rsa = NULL;
Packit 6c0a39
Packit 6c0a39
    ssh_key_free(key);
Packit 6c0a39
Packit 6c0a39
    return privkey;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
enum ssh_keytypes_e ssh_privatekey_type(ssh_private_key privatekey){
Packit 6c0a39
  if (privatekey==NULL)
Packit 6c0a39
    return SSH_KEYTYPE_UNKNOWN;
Packit 6c0a39
  return privatekey->type;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
void privatekey_free(ssh_private_key prv) {
Packit 6c0a39
  if (prv == NULL) {
Packit 6c0a39
    return;
Packit 6c0a39
  }
Packit 6c0a39
Packit 6c0a39
#ifdef HAVE_LIBGCRYPT
Packit 6c0a39
  gcry_sexp_release(prv->dsa_priv);
Packit 6c0a39
  gcry_sexp_release(prv->rsa_priv);
Packit 6c0a39
#elif defined HAVE_LIBCRYPTO
Packit 6c0a39
  DSA_free(prv->dsa_priv);
Packit 6c0a39
  RSA_free(prv->rsa_priv);
Packit 6c0a39
#elif defined HAVE_LIBMBEDCRYPTO
Packit 6c0a39
  mbedtls_pk_free(prv->rsa_priv);
Packit 6c0a39
  SAFE_FREE(prv->rsa_priv);
Packit 6c0a39
#endif
Packit 6c0a39
  memset(prv, 0, sizeof(struct ssh_private_key_struct));
Packit 6c0a39
  SAFE_FREE(prv);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_string publickey_from_file(ssh_session session, const char *filename,
Packit 6c0a39
    int *type) {
Packit 6c0a39
    ssh_key key;
Packit 6c0a39
    ssh_string key_str = NULL;
Packit 6c0a39
    int rc;
Packit 6c0a39
Packit 6c0a39
    (void) session; /* unused */
Packit 6c0a39
Packit 6c0a39
    rc = ssh_pki_import_pubkey_file(filename, &key);
Packit 6c0a39
    if (rc < 0) {
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    rc = ssh_pki_export_pubkey_blob(key, &key_str);
Packit 6c0a39
    if (rc < 0) {
Packit 6c0a39
        ssh_key_free(key);
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    if (type) {
Packit 6c0a39
        *type = key->type;
Packit 6c0a39
    }
Packit 6c0a39
    ssh_key_free(key);
Packit 6c0a39
Packit 6c0a39
    return key_str;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
const char *ssh_type_to_char(int type) {
Packit 6c0a39
    return ssh_key_type_to_char(type);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int ssh_type_from_name(const char *name) {
Packit 6c0a39
    return ssh_key_type_from_name(name);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_public_key publickey_from_string(ssh_session session, ssh_string pubkey_s) {
Packit 6c0a39
    struct ssh_public_key_struct *pubkey;
Packit 6c0a39
    ssh_key key;
Packit 6c0a39
    int rc;
Packit 6c0a39
Packit 6c0a39
    (void) session; /* unused */
Packit 6c0a39
Packit 6c0a39
    rc = ssh_pki_import_pubkey_blob(pubkey_s, &key);
Packit 6c0a39
    if (rc < 0) {
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    pubkey = malloc(sizeof(struct ssh_public_key_struct));
Packit 6c0a39
    if (pubkey == NULL) {
Packit 6c0a39
        ssh_key_free(key);
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    pubkey->type = key->type;
Packit 6c0a39
    pubkey->type_c = key->type_c;
Packit 6c0a39
Packit 6c0a39
    pubkey->dsa_pub = key->dsa;
Packit 6c0a39
    key->dsa = NULL;
Packit 6c0a39
    pubkey->rsa_pub = key->rsa;
Packit 6c0a39
    key->rsa = NULL;
Packit 6c0a39
Packit 6c0a39
    ssh_key_free(key);
Packit 6c0a39
Packit 6c0a39
    return pubkey;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_string publickey_to_string(ssh_public_key pubkey) {
Packit 6c0a39
    ssh_key key;
Packit 6c0a39
    ssh_string key_blob;
Packit 6c0a39
    int rc;
Packit 6c0a39
Packit 6c0a39
    if (pubkey == NULL) {
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    key = ssh_key_new();
Packit 6c0a39
    if (key == NULL) {
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    key->type = pubkey->type;
Packit 6c0a39
    key->type_c = pubkey->type_c;
Packit 6c0a39
Packit 6c0a39
    key->dsa = pubkey->dsa_pub;
Packit 6c0a39
    key->rsa = pubkey->rsa_pub;
Packit 6c0a39
Packit 6c0a39
    rc = ssh_pki_export_pubkey_blob(key, &key_blob);
Packit 6c0a39
    if (rc < 0) {
Packit 6c0a39
        key_blob = NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    key->dsa = NULL;
Packit 6c0a39
    key->rsa = NULL;
Packit 6c0a39
    ssh_key_free(key);
Packit 6c0a39
Packit 6c0a39
    return key_blob;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int ssh_publickey_to_file(ssh_session session,
Packit 6c0a39
                          const char *file,
Packit 6c0a39
                          ssh_string pubkey,
Packit 6c0a39
                          int type)
Packit 6c0a39
{
Packit 6c0a39
    FILE *fp;
Packit 6c0a39
    char *user;
Packit 6c0a39
    char buffer[1024];
Packit 6c0a39
    char host[256];
Packit 6c0a39
    unsigned char *pubkey_64;
Packit 6c0a39
    size_t len;
Packit 6c0a39
    int rc;
Packit 6c0a39
    if(session==NULL)
Packit 6c0a39
        return SSH_ERROR;
Packit 6c0a39
    if(file==NULL || pubkey==NULL){
Packit 6c0a39
        ssh_set_error(session, SSH_FATAL, "Invalid parameters");
Packit 6c0a39
        return SSH_ERROR;
Packit 6c0a39
    }
Packit 6c0a39
    pubkey_64 = bin_to_base64(ssh_string_data(pubkey), ssh_string_len(pubkey));
Packit 6c0a39
    if (pubkey_64 == NULL) {
Packit 6c0a39
        return SSH_ERROR;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    user = ssh_get_local_username();
Packit 6c0a39
    if (user == NULL) {
Packit 6c0a39
        SAFE_FREE(pubkey_64);
Packit 6c0a39
        return SSH_ERROR;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    rc = gethostname(host, sizeof(host));
Packit 6c0a39
    if (rc < 0) {
Packit 6c0a39
        SAFE_FREE(user);
Packit 6c0a39
        SAFE_FREE(pubkey_64);
Packit 6c0a39
        return SSH_ERROR;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    snprintf(buffer, sizeof(buffer), "%s %s %s@%s\n",
Packit 6c0a39
            ssh_type_to_char(type),
Packit 6c0a39
            pubkey_64,
Packit 6c0a39
            user,
Packit 6c0a39
            host);
Packit 6c0a39
Packit 6c0a39
    SAFE_FREE(pubkey_64);
Packit 6c0a39
    SAFE_FREE(user);
Packit 6c0a39
Packit 6c0a39
    SSH_LOG(SSH_LOG_RARE, "Trying to write public key file: %s", file);
Packit 6c0a39
    SSH_LOG(SSH_LOG_PACKET, "public key file content: %s", buffer);
Packit 6c0a39
Packit 6c0a39
    fp = fopen(file, "w+");
Packit 6c0a39
    if (fp == NULL) {
Packit 6c0a39
        ssh_set_error(session, SSH_REQUEST_DENIED,
Packit 6c0a39
                "Error opening %s: %s", file, strerror(errno));
Packit 6c0a39
        return SSH_ERROR;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    len = strlen(buffer);
Packit 6c0a39
    if (fwrite(buffer, len, 1, fp) != 1 || ferror(fp)) {
Packit 6c0a39
        ssh_set_error(session, SSH_REQUEST_DENIED,
Packit 6c0a39
                "Unable to write to %s", file);
Packit 6c0a39
        fclose(fp);
Packit 6c0a39
        unlink(file);
Packit 6c0a39
        return SSH_ERROR;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    fclose(fp);
Packit 6c0a39
    return SSH_OK;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int ssh_try_publickey_from_file(ssh_session session,
Packit 6c0a39
                                const char *keyfile,
Packit 6c0a39
                                ssh_string *publickey,
Packit 6c0a39
                                int *type) {
Packit 6c0a39
    char *pubkey_file;
Packit 6c0a39
    size_t len;
Packit 6c0a39
    ssh_string pubkey_string;
Packit 6c0a39
    int pubkey_type;
Packit 6c0a39
Packit 6c0a39
    if (session == NULL || keyfile == NULL || publickey == NULL || type == NULL) {
Packit 6c0a39
        return -1;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    if (session->opts.sshdir == NULL) {
Packit 6c0a39
        if (ssh_options_apply(session) < 0) {
Packit 6c0a39
            return -1;
Packit 6c0a39
        }
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    SSH_LOG(SSH_LOG_PACKET, "Trying to open privatekey %s", keyfile);
Packit 6c0a39
    if (!ssh_file_readaccess_ok(keyfile)) {
Packit 6c0a39
        SSH_LOG(SSH_LOG_PACKET, "Failed to open privatekey %s", keyfile);
Packit 6c0a39
        return -1;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    len = strlen(keyfile) + 5;
Packit 6c0a39
    pubkey_file = malloc(len);
Packit 6c0a39
    if (pubkey_file == NULL) {
Packit 6c0a39
        return -1;
Packit 6c0a39
    }
Packit 6c0a39
    snprintf(pubkey_file, len, "%s.pub", keyfile);
Packit 6c0a39
Packit 6c0a39
    SSH_LOG(SSH_LOG_PACKET, "Trying to open publickey %s",
Packit 6c0a39
            pubkey_file);
Packit 6c0a39
    if (!ssh_file_readaccess_ok(pubkey_file)) {
Packit 6c0a39
        SSH_LOG(SSH_LOG_PACKET, "Failed to open publickey %s",
Packit 6c0a39
                pubkey_file);
Packit 6c0a39
        SAFE_FREE(pubkey_file);
Packit 6c0a39
        return 1;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    SSH_LOG(SSH_LOG_PACKET, "Success opening public and private key");
Packit 6c0a39
Packit 6c0a39
    /*
Packit 6c0a39
     * We are sure both the private and public key file is readable. We return
Packit 6c0a39
     * the public as a string, and the private filename as an argument
Packit 6c0a39
     */
Packit 6c0a39
    pubkey_string = publickey_from_file(session, pubkey_file, &pubkey_type);
Packit 6c0a39
    if (pubkey_string == NULL) {
Packit 6c0a39
        SSH_LOG(SSH_LOG_PACKET,
Packit 6c0a39
                "Wasn't able to open public key file %s: %s",
Packit 6c0a39
                pubkey_file,
Packit 6c0a39
                ssh_get_error(session));
Packit 6c0a39
        SAFE_FREE(pubkey_file);
Packit 6c0a39
        return -1;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    SAFE_FREE(pubkey_file);
Packit 6c0a39
Packit 6c0a39
    *publickey = pubkey_string;
Packit 6c0a39
    *type = pubkey_type;
Packit 6c0a39
Packit 6c0a39
    return 0;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
ssh_string ssh_get_pubkey(ssh_session session)
Packit 6c0a39
{
Packit 6c0a39
    ssh_string pubkey_blob = NULL;
Packit 6c0a39
    int rc;
Packit 6c0a39
Packit 6c0a39
    if (session == NULL ||
Packit 6c0a39
        session->current_crypto == NULL ||
Packit 6c0a39
        session->current_crypto->server_pubkey == NULL) {
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    rc = ssh_dh_get_current_server_publickey_blob(session,
Packit 6c0a39
                                                  &pubkey_blob);
Packit 6c0a39
    if (rc != 0) {
Packit 6c0a39
        return NULL;
Packit 6c0a39
    }
Packit 6c0a39
Packit 6c0a39
    return pubkey_blob;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
/****************************************************************************
Packit 6c0a39
 * SERVER SUPPORT
Packit 6c0a39
 ****************************************************************************/
Packit 6c0a39
Packit 6c0a39
#ifdef WITH_SERVER
Packit 6c0a39
int ssh_accept(ssh_session session) {
Packit 6c0a39
    return ssh_handle_key_exchange(session);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int channel_write_stderr(ssh_channel channel, const void *data, uint32_t len) {
Packit 6c0a39
    return ssh_channel_write(channel, data, len);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
/** @deprecated
Packit 6c0a39
 * @brief Interface previously exported by error.
Packit 6c0a39
 */
Packit 6c0a39
ssh_message ssh_message_retrieve(ssh_session session, uint32_t packettype){
Packit 6c0a39
	(void) packettype;
Packit 6c0a39
	ssh_set_error(session, SSH_FATAL, "ssh_message_retrieve: obsolete libssh call");
Packit 6c0a39
	return NULL;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
#endif /* WITH_SERVER */