1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-05-14 20:15:08 +03:00

crypto: Change the type of server_pubkey to ssh_key

Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
Andreas Schneider 2017-11-10 17:35:38 +01:00
parent 7e1e0e5098
commit 16217454d5
9 changed files with 191 additions and 73 deletions

View File

@ -109,8 +109,7 @@ struct ssh_crypto_struct {
struct ssh_cipher_struct *in_cipher, *out_cipher; /* the cipher structures/objects */ struct ssh_cipher_struct *in_cipher, *out_cipher; /* the cipher structures/objects */
enum ssh_hmac_e in_hmac, out_hmac; /* the MAC algorithms used */ enum ssh_hmac_e in_hmac, out_hmac; /* the MAC algorithms used */
ssh_string server_pubkey; ssh_key server_pubkey;
const char *server_pubkey_type;
int do_compress_out; /* idem */ int do_compress_out; /* idem */
int do_compress_in; /* don't set them, set the option instead */ int do_compress_in; /* don't set them, set the option instead */
int delayed_compress_in; /* Use of zlib@openssh.org */ int delayed_compress_in; /* Use of zlib@openssh.org */

View File

@ -37,11 +37,21 @@ ssh_string ssh_dh_get_e(ssh_session session);
ssh_string ssh_dh_get_f(ssh_session session); ssh_string ssh_dh_get_f(ssh_session session);
int ssh_dh_import_f(ssh_session session,ssh_string f_string); int ssh_dh_import_f(ssh_session session,ssh_string f_string);
int ssh_dh_import_e(ssh_session session, ssh_string e_string); int ssh_dh_import_e(ssh_session session, ssh_string e_string);
void ssh_dh_import_pubkey(ssh_session session,ssh_string pubkey_string);
int ssh_dh_import_pubkey_blob(ssh_session session, ssh_string pubkey_blob);
int ssh_dh_import_next_pubkey_blob(ssh_session session, ssh_string pubkey_blob);
int ssh_dh_build_k(ssh_session session); int ssh_dh_build_k(ssh_session session);
int ssh_client_dh_init(ssh_session session); int ssh_client_dh_init(ssh_session session);
int ssh_client_dh_reply(ssh_session session, ssh_buffer packet); int ssh_client_dh_reply(ssh_session session, ssh_buffer packet);
ssh_key ssh_dh_get_current_server_publickey(ssh_session session);
int ssh_dh_get_current_server_publickey_blob(ssh_session session,
ssh_string *pubkey_blob);
ssh_key ssh_dh_get_next_server_publickey(ssh_session session);
int ssh_dh_get_next_server_publickey_blob(ssh_session session,
ssh_string *pubkey_blob);
int ssh_make_sessionid(ssh_session session); int ssh_make_sessionid(ssh_session session);
/* add data for the final cookie */ /* add data for the final cookie */
int ssh_hashbufin_add_cookie(ssh_session session, unsigned char *cookie); int ssh_hashbufin_add_cookie(ssh_session session, unsigned char *cookie);

View File

@ -118,17 +118,24 @@ static int ssh_curve25519_build_k(ssh_session session) {
*/ */
int ssh_client_curve25519_reply(ssh_session session, ssh_buffer packet){ int ssh_client_curve25519_reply(ssh_session session, ssh_buffer packet){
ssh_string q_s_string = NULL; ssh_string q_s_string = NULL;
ssh_string pubkey = NULL; ssh_string pubkey_blob = NULL;
ssh_string signature = NULL; ssh_string signature = NULL;
int rc; int rc;
pubkey = ssh_buffer_get_ssh_string(packet);
if (pubkey == NULL){ pubkey_blob = ssh_buffer_get_ssh_string(packet);
if (pubkey_blob == NULL) {
ssh_set_error(session,SSH_FATAL, "No public key in packet"); ssh_set_error(session,SSH_FATAL, "No public key in packet");
goto error; goto error;
} }
/* this is the server host key */
session->next_crypto->server_pubkey = pubkey; rc = ssh_dh_import_next_pubkey_blob(session, pubkey_blob);
pubkey = NULL; ssh_string_free(pubkey_blob);
if (rc != 0) {
ssh_set_error(session,
SSH_FATAL,
"Failed to import next public key");
goto error;
}
q_s_string = ssh_buffer_get_ssh_string(packet); q_s_string = ssh_buffer_get_ssh_string(packet);
if (q_s_string == NULL) { if (q_s_string == NULL) {
@ -178,6 +185,7 @@ int ssh_server_curve25519_init(ssh_session session, ssh_buffer packet){
/* ECDH keys */ /* ECDH keys */
ssh_string q_c_string; ssh_string q_c_string;
ssh_string q_s_string; ssh_string q_s_string;
ssh_string server_pubkey_blob = NULL;
/* SSH host keys (rsa,dsa,ecdsa) */ /* SSH host keys (rsa,dsa,ecdsa) */
ssh_key privkey; ssh_key privkey;
@ -236,9 +244,16 @@ int ssh_server_curve25519_init(ssh_session session, ssh_buffer packet){
goto error; goto error;
} }
rc = ssh_dh_get_next_server_publickey_blob(session, &server_pubkey_blob);
if (rc != 0) {
ssh_set_error(session, SSH_FATAL, "Could not export server public key");
goto error;
}
/* add host's public key */ /* add host's public key */
rc = ssh_buffer_add_ssh_string(session->out_buffer, rc = ssh_buffer_add_ssh_string(session->out_buffer,
session->next_crypto->server_pubkey); server_pubkey_blob);
ssh_string_free(server_pubkey_blob);
if (rc < 0) { if (rc < 0) {
ssh_set_error_oom(session); ssh_set_error_oom(session);
goto error; goto error;

View File

@ -387,8 +387,17 @@ ssh_string ssh_dh_get_f(ssh_session session) {
return ssh_make_bignum_string(session->next_crypto->f); return ssh_make_bignum_string(session->next_crypto->f);
} }
void ssh_dh_import_pubkey(ssh_session session, ssh_string pubkey_string) { int ssh_dh_import_pubkey_blob(ssh_session session, ssh_string pubkey_blob)
session->next_crypto->server_pubkey = pubkey_string; {
return ssh_pki_import_pubkey_blob(pubkey_blob,
&session->current_crypto->server_pubkey);
}
int ssh_dh_import_next_pubkey_blob(ssh_session session, ssh_string pubkey_blob)
{
return ssh_pki_import_pubkey_blob(pubkey_blob,
&session->next_crypto->server_pubkey);
} }
int ssh_dh_import_f(ssh_session session, ssh_string f_string) { int ssh_dh_import_f(ssh_session session, ssh_string f_string) {
@ -517,15 +526,21 @@ int ssh_client_dh_init(ssh_session session){
int ssh_client_dh_reply(ssh_session session, ssh_buffer packet){ int ssh_client_dh_reply(ssh_session session, ssh_buffer packet){
ssh_string f; ssh_string f;
ssh_string pubkey = NULL; ssh_string pubkey_blob = NULL;
ssh_string signature = NULL; ssh_string signature = NULL;
int rc; int rc;
pubkey = ssh_buffer_get_ssh_string(packet);
if (pubkey == NULL){ pubkey_blob = ssh_buffer_get_ssh_string(packet);
if (pubkey_blob == NULL){
ssh_set_error(session,SSH_FATAL, "No public key in packet"); ssh_set_error(session,SSH_FATAL, "No public key in packet");
goto error; goto error;
} }
ssh_dh_import_pubkey(session, pubkey);
rc = ssh_dh_import_next_pubkey_blob(session, pubkey_blob);
ssh_string_free(pubkey_blob);
if (rc != 0) {
goto error;
}
f = ssh_buffer_get_ssh_string(packet); f = ssh_buffer_get_ssh_string(packet);
if (f == NULL) { if (f == NULL) {
@ -569,6 +584,7 @@ int ssh_make_sessionid(ssh_session session) {
ssh_buffer server_hash = NULL; ssh_buffer server_hash = NULL;
ssh_buffer client_hash = NULL; ssh_buffer client_hash = NULL;
ssh_buffer buf = NULL; ssh_buffer buf = NULL;
ssh_string server_pubkey_blob = NULL;
int rc = SSH_ERROR; int rc = SSH_ERROR;
buf = ssh_buffer_new(); buf = ssh_buffer_new();
@ -619,6 +635,11 @@ int ssh_make_sessionid(ssh_session session) {
} }
} }
rc = ssh_dh_get_next_server_publickey_blob(session, &server_pubkey_blob);
if (rc != SSH_OK) {
goto error;
}
rc = ssh_buffer_pack(buf, rc = ssh_buffer_pack(buf,
"dPdPS", "dPdPS",
ssh_buffer_get_len(client_hash), ssh_buffer_get_len(client_hash),
@ -627,8 +648,8 @@ int ssh_make_sessionid(ssh_session session) {
ssh_buffer_get_len(server_hash), ssh_buffer_get_len(server_hash),
ssh_buffer_get_len(server_hash), ssh_buffer_get_len(server_hash),
ssh_buffer_get(server_hash), ssh_buffer_get(server_hash),
session->next_crypto->server_pubkey); server_pubkey_blob);
ssh_string_free(server_pubkey_blob);
if(rc != SSH_OK){ if(rc != SSH_OK){
goto error; goto error;
} }
@ -959,9 +980,11 @@ error:
* @deprecated Use ssh_get_publickey_hash() * @deprecated Use ssh_get_publickey_hash()
*/ */
int ssh_get_pubkey_hash(ssh_session session, unsigned char **hash) { int ssh_get_pubkey_hash(ssh_session session, unsigned char **hash) {
ssh_string pubkey; ssh_key pubkey = NULL;
ssh_string pubkey_blob = NULL;
MD5CTX ctx; MD5CTX ctx;
unsigned char *h; unsigned char *h;
int rc;
if (session == NULL || hash == NULL) { if (session == NULL || hash == NULL) {
return SSH_ERROR; return SSH_ERROR;
@ -984,9 +1007,19 @@ int ssh_get_pubkey_hash(ssh_session session, unsigned char **hash) {
return SSH_ERROR; return SSH_ERROR;
} }
pubkey = session->current_crypto->server_pubkey; rc = ssh_get_server_publickey(session, &pubkey);
if (rc != 0) {
SAFE_FREE(h);
return SSH_ERROR;
}
md5_update(ctx, ssh_string_data(pubkey), ssh_string_len(pubkey)); rc = ssh_pki_export_pubkey_blob(pubkey,
&pubkey_blob);
ssh_key_free(pubkey);
if (rc != 0) {
}
md5_update(ctx, ssh_string_data(pubkey_blob), ssh_string_len(pubkey_blob));
ssh_string_free(pubkey_blob);
md5_final(h, ctx); md5_final(h, ctx);
*hash = h; *hash = h;
@ -1023,14 +1056,49 @@ void ssh_clean_pubkey_hash(unsigned char **hash) {
*/ */
int ssh_get_server_publickey(ssh_session session, ssh_key *key) int ssh_get_server_publickey(ssh_session session, ssh_key *key)
{ {
if (session==NULL || ssh_key pubkey = NULL;
session->current_crypto ==NULL ||
if (session == NULL ||
session->current_crypto == NULL ||
session->current_crypto->server_pubkey == NULL) { session->current_crypto->server_pubkey == NULL) {
return SSH_ERROR; return SSH_ERROR;
} }
return ssh_pki_import_pubkey_blob(session->current_crypto->server_pubkey, pubkey = ssh_key_dup(session->current_crypto->server_pubkey);
key); if (pubkey == NULL) {
return SSH_ERROR;
}
*key = pubkey;
return SSH_OK;
}
ssh_key ssh_dh_get_current_server_publickey(ssh_session session)
{
return session->current_crypto->server_pubkey;
}
/* Caller need to free the blob */
int ssh_dh_get_current_server_publickey_blob(ssh_session session,
ssh_string *pubkey_blob)
{
const ssh_key pubkey = ssh_dh_get_current_server_publickey(session);
return ssh_pki_export_pubkey_blob(pubkey, pubkey_blob);
}
ssh_key ssh_dh_get_next_server_publickey(ssh_session session)
{
return session->next_crypto->server_pubkey;
}
/* Caller need to free the blob */
int ssh_dh_get_next_server_publickey_blob(ssh_session session,
ssh_string *pubkey_blob)
{
const ssh_key pubkey = ssh_dh_get_next_server_publickey(session);
return ssh_pki_export_pubkey_blob(pubkey, pubkey_blob);
} }
/** /**

View File

@ -30,25 +30,27 @@
#ifdef HAVE_ECDH #ifdef HAVE_ECDH
static void ecdh_import_pubkey(ssh_session session, ssh_string pubkey_string) {
session->next_crypto->server_pubkey = pubkey_string;
}
/** @internal /** @internal
* @brief parses a SSH_MSG_KEX_ECDH_REPLY packet and sends back * @brief parses a SSH_MSG_KEX_ECDH_REPLY packet and sends back
* a SSH_MSG_NEWKEYS * a SSH_MSG_NEWKEYS
*/ */
int ssh_client_ecdh_reply(ssh_session session, ssh_buffer packet){ int ssh_client_ecdh_reply(ssh_session session, ssh_buffer packet){
ssh_string q_s_string = NULL; ssh_string q_s_string = NULL;
ssh_string pubkey = NULL; ssh_string pubkey_blob = NULL;
ssh_string signature = NULL; ssh_string signature = NULL;
int rc; int rc;
pubkey = ssh_buffer_get_ssh_string(packet);
if (pubkey == NULL){ pubkey_blob = ssh_buffer_get_ssh_string(packet);
if (pubkey_blob == NULL) {
ssh_set_error(session,SSH_FATAL, "No public key in packet"); ssh_set_error(session,SSH_FATAL, "No public key in packet");
goto error; goto error;
} }
ecdh_import_pubkey(session, pubkey);
rc = ssh_dh_import_next_pubkey_blob(session, pubkey_blob);
ssh_string_free(pubkey_blob);
if (rc != 0) {
goto error;
}
q_s_string = ssh_buffer_get_ssh_string(packet); q_s_string = ssh_buffer_get_ssh_string(packet);
if (q_s_string == NULL) { if (q_s_string == NULL) {

View File

@ -32,6 +32,7 @@
#include "libssh/session.h" #include "libssh/session.h"
#include "libssh/buffer.h" #include "libssh/buffer.h"
#include "libssh/misc.h" #include "libssh/misc.h"
#include "libssh/dh.h"
#include "libssh/pki.h" #include "libssh/pki.h"
#include "libssh/options.h" #include "libssh/options.h"
#include "libssh/knownhosts.h" #include "libssh/knownhosts.h"
@ -188,9 +189,10 @@ static char **ssh_get_knownhost_line(FILE **file, const char *filename,
* on error. * on error.
*/ */
static int check_public_key(ssh_session session, char **tokens) { static int check_public_key(ssh_session session, char **tokens) {
ssh_string pubkey = session->current_crypto->server_pubkey; ssh_string pubkey_blob = NULL;
ssh_buffer pubkey_buffer; ssh_buffer pubkey_buffer;
char *pubkey_64; char *pubkey_64;
int rc;
/* ok we found some public key in known hosts file. now un-base64it */ /* ok we found some public key in known hosts file. now un-base64it */
if (alldigits(tokens[1])) { if (alldigits(tokens[1])) {
@ -270,18 +272,26 @@ static int check_public_key(ssh_session session, char **tokens) {
return -1; return -1;
} }
if (ssh_buffer_get_len(pubkey_buffer) != ssh_string_len(pubkey)) { rc = ssh_dh_get_current_server_publickey_blob(session, &pubkey_blob);
if (rc != 0) {
return -1;
}
if (ssh_buffer_get_len(pubkey_buffer) != ssh_string_len(pubkey_blob)) {
ssh_string_free(pubkey_blob);
ssh_buffer_free(pubkey_buffer); ssh_buffer_free(pubkey_buffer);
return 0; return 0;
} }
/* now test that they are identical */ /* now test that they are identical */
if (memcmp(ssh_buffer_get(pubkey_buffer), ssh_string_data(pubkey), if (memcmp(ssh_buffer_get(pubkey_buffer), ssh_string_data(pubkey_blob),
ssh_buffer_get_len(pubkey_buffer)) != 0) { ssh_buffer_get_len(pubkey_buffer)) != 0) {
ssh_string_free(pubkey_blob);
ssh_buffer_free(pubkey_buffer); ssh_buffer_free(pubkey_buffer);
return 0; return 0;
} }
ssh_string_free(pubkey_blob);
ssh_buffer_free(pubkey_buffer); ssh_buffer_free(pubkey_buffer);
return 1; return 1;
} }
@ -485,12 +495,21 @@ int ssh_is_server_known(ssh_session session) {
match = match_hashed_host(hostport, tokens[0]); match = match_hashed_host(hostport, tokens[0]);
} }
if (match) { if (match) {
ssh_key pubkey = ssh_dh_get_current_server_publickey(session);
const char *pubkey_type = NULL;
if (ssh_key_type(pubkey) == SSH_KEYTYPE_ECDSA) {
pubkey_type = ssh_pki_key_ecdsa_name(pubkey);
} else {
pubkey_type = ssh_key_type_to_char(ssh_key_type(pubkey));
}
/* We got a match. Now check the key type */ /* We got a match. Now check the key type */
if (strcmp(session->current_crypto->server_pubkey_type, type) != 0) { if (strcmp(pubkey_type, type) != 0) {
SSH_LOG(SSH_LOG_PACKET, SSH_LOG(SSH_LOG_PACKET,
"ssh_is_server_known: server type [%s] doesn't match the " "ssh_is_server_known: server type [%s] doesn't match the "
"type [%s] in known_hosts file", "type [%s] in known_hosts file",
session->current_crypto->server_pubkey_type, pubkey_type,
type); type);
/* Different type. We don't override the known_changed error which is /* Different type. We don't override the known_changed error which is
* more important */ * more important */
@ -545,8 +564,7 @@ int ssh_is_server_known(ssh_session session) {
* @return string on success, NULL on error. * @return string on success, NULL on error.
*/ */
char * ssh_dump_knownhost(ssh_session session) { char * ssh_dump_knownhost(ssh_session session) {
ssh_string pubkey_s; ssh_key server_pubkey = NULL;
ssh_key key;
char *host; char *host;
char *hostport; char *hostport;
size_t len = 4096; size_t len = 4096;
@ -578,40 +596,31 @@ char * ssh_dump_knownhost(ssh_session session) {
return NULL; return NULL;
} }
pubkey_s = session->current_crypto->server_pubkey; server_pubkey = ssh_dh_get_current_server_publickey(session);
if (pubkey_s == NULL){ if (server_pubkey == NULL){
ssh_set_error(session, SSH_FATAL, "No public key present"); ssh_set_error(session, SSH_FATAL, "No public key present");
SAFE_FREE(host); SAFE_FREE(host);
return NULL; return NULL;
} }
rc = ssh_pki_import_pubkey_blob(pubkey_s, &key);
if (rc < 0) {
SAFE_FREE(host);
return NULL;
}
buffer = calloc (1, 4096); buffer = calloc (1, 4096);
if (!buffer) { if (!buffer) {
ssh_key_free(key);
SAFE_FREE(host); SAFE_FREE(host);
return NULL; return NULL;
} }
if (strcmp(session->current_crypto->server_pubkey_type, "ssh-rsa1") == 0) { if (ssh_key_type(server_pubkey) == SSH_KEYTYPE_RSA1) {
/* openssh uses a different format for ssh-rsa1 keys. /* openssh uses a different format for ssh-rsa1 keys.
Be compatible --kv */ Be compatible --kv */
rc = ssh_pki_export_pubkey_rsa1(key, host, buffer, len); rc = ssh_pki_export_pubkey_rsa1(server_pubkey, host, buffer, len);
ssh_key_free(key);
SAFE_FREE(host); SAFE_FREE(host);
if (rc < 0) { if (rc < 0) {
SAFE_FREE(buffer); SAFE_FREE(buffer);
return NULL; return NULL;
} }
} else { } else {
rc = ssh_pki_export_pubkey_base64(key, &b64_key); rc = ssh_pki_export_pubkey_base64(server_pubkey, &b64_key);
if (rc < 0) { if (rc < 0) {
ssh_key_free(key);
SAFE_FREE(buffer); SAFE_FREE(buffer);
SAFE_FREE(host); SAFE_FREE(host);
return NULL; return NULL;
@ -620,10 +629,9 @@ char * ssh_dump_knownhost(ssh_session session) {
snprintf(buffer, len, snprintf(buffer, len,
"%s %s %s\n", "%s %s %s\n",
host, host,
key->type_c, server_pubkey->type_c,
b64_key); b64_key);
ssh_key_free(key);
SAFE_FREE(host); SAFE_FREE(host);
SAFE_FREE(b64_key); SAFE_FREE(b64_key);
} }

View File

@ -33,6 +33,7 @@
#include <libssh/session.h> #include <libssh/session.h>
#include <libssh/server.h> #include <libssh/server.h>
#include <libssh/buffer.h> #include <libssh/buffer.h>
#include <libssh/dh.h>
#include <libssh/pki.h> #include <libssh/pki.h>
#include "libssh/pki_priv.h" #include "libssh/pki_priv.h"
#include <libssh/misc.h> #include <libssh/misc.h>
@ -701,12 +702,24 @@ int ssh_try_publickey_from_file(ssh_session session,
return 0; return 0;
} }
ssh_string ssh_get_pubkey(ssh_session session){ ssh_string ssh_get_pubkey(ssh_session session)
if(session==NULL || session->current_crypto ==NULL || {
session->current_crypto->server_pubkey==NULL) ssh_string pubkey_blob = NULL;
return NULL; int rc;
else
return ssh_string_copy(session->current_crypto->server_pubkey); if (session == NULL ||
session->current_crypto == NULL ||
session->current_crypto->server_pubkey == NULL) {
return NULL;
}
rc = ssh_dh_get_current_server_publickey_blob(session,
&pubkey_blob);
if (rc != 0) {
return NULL;
}
return pubkey_blob;
} }
/**************************************************************************** /****************************************************************************

View File

@ -154,7 +154,8 @@ SSH_PACKET_CALLBACK(ssh_packet_newkeys){
/* server things are done in server.c */ /* server things are done in server.c */
session->dh_handshake_state=DH_STATE_FINISHED; session->dh_handshake_state=DH_STATE_FINISHED;
} else { } else {
ssh_key key; ssh_key server_key;
/* client */ /* client */
rc = ssh_make_sessionid(session); rc = ssh_make_sessionid(session);
if (rc != SSH_OK) { if (rc != SSH_OK) {
@ -178,7 +179,7 @@ SSH_PACKET_CALLBACK(ssh_packet_newkeys){
session->next_crypto->dh_server_signature = NULL; session->next_crypto->dh_server_signature = NULL;
/* get the server public key */ /* get the server public key */
rc = ssh_pki_import_pubkey_blob(session->next_crypto->server_pubkey, &key); server_key = ssh_dh_get_next_server_publickey(session);
if (rc < 0) { if (rc < 0) {
return SSH_ERROR; return SSH_ERROR;
} }
@ -186,27 +187,22 @@ SSH_PACKET_CALLBACK(ssh_packet_newkeys){
/* check if public key from server matches user preferences */ /* check if public key from server matches user preferences */
if (session->opts.wanted_methods[SSH_HOSTKEYS]) { if (session->opts.wanted_methods[SSH_HOSTKEYS]) {
if(!ssh_match_group(session->opts.wanted_methods[SSH_HOSTKEYS], if(!ssh_match_group(session->opts.wanted_methods[SSH_HOSTKEYS],
key->type_c)) { server_key->type_c)) {
ssh_set_error(session, ssh_set_error(session,
SSH_FATAL, SSH_FATAL,
"Public key from server (%s) doesn't match user " "Public key from server (%s) doesn't match user "
"preference (%s)", "preference (%s)",
key->type_c, server_key->type_c,
session->opts.wanted_methods[SSH_HOSTKEYS]); session->opts.wanted_methods[SSH_HOSTKEYS]);
ssh_key_free(key);
return -1; return -1;
} }
} }
rc = ssh_pki_signature_verify_blob(session, rc = ssh_pki_signature_verify_blob(session,
sig_blob, sig_blob,
key, server_key,
session->next_crypto->secret_hash, session->next_crypto->secret_hash,
session->next_crypto->digest_len); session->next_crypto->digest_len);
/* Set the server public key type for known host checking */
session->next_crypto->server_pubkey_type = key->type_c;
ssh_key_free(key);
ssh_string_burn(sig_blob); ssh_string_burn(sig_blob);
ssh_string_free(sig_blob); ssh_string_free(sig_blob);
sig_blob = NULL; sig_blob = NULL;

View File

@ -277,7 +277,14 @@ int ssh_get_key_params(ssh_session session, ssh_key *privkey){
return -1; return -1;
} }
ssh_dh_import_pubkey(session, pubkey_blob); rc = ssh_dh_import_pubkey_blob(session, pubkey_blob);
if (rc != 0) {
ssh_set_error(session,
SSH_FATAL,
"Could not import server public key");
return -1;
}
return SSH_OK; return SSH_OK;
} }