OpenCoverage

kexecdhs.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssh/src/kexecdhs.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: kexecdhs.c,v 1.17 2018/02/07 02:06:51 jsing Exp $ */-
2/*-
3 * Copyright (c) 2001 Markus Friedl. All rights reserved.-
4 * Copyright (c) 2010 Damien Miller. All rights reserved.-
5 *-
6 * Redistribution and use in source and binary forms, with or without-
7 * modification, are permitted provided that the following conditions-
8 * are met:-
9 * 1. Redistributions of source code must retain the above copyright-
10 * notice, this list of conditions and the following disclaimer.-
11 * 2. Redistributions in binary form must reproduce the above copyright-
12 * notice, this list of conditions and the following disclaimer in the-
13 * documentation and/or other materials provided with the distribution.-
14 *-
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR-
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES-
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.-
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,-
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT-
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,-
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY-
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT-
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF-
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.-
25 */-
26-
27#include "includes.h"-
28-
29#if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)-
30-
31#include <sys/types.h>-
32#include <string.h>-
33#include <signal.h>-
34-
35#include <openssl/ecdh.h>-
36-
37#include "sshkey.h"-
38#include "cipher.h"-
39#include "digest.h"-
40#include "kex.h"-
41#include "log.h"-
42#include "packet.h"-
43#include "ssh2.h"-
44-
45#include "dispatch.h"-
46#include "compat.h"-
47#include "ssherr.h"-
48#include "sshbuf.h"-
49-
50static int input_kex_ecdh_init(int, u_int32_t, struct ssh *);-
51-
52int-
53kexecdh_server(struct ssh *ssh)-
54{-
55 debug("expecting SSH2_MSG_KEX_ECDH_INIT");-
56 ssh_dispatch_set(ssh, SSH2_MSG_KEX_ECDH_INIT, &input_kex_ecdh_init);-
57 return 0;
executed 60 times by 1 test: return 0;
Executed by:
  • test_kex
60
58}-
59-
60static int-
61input_kex_ecdh_init(int type, u_int32_t seq, struct ssh *ssh)-
62{-
63 struct kex *kex = ssh->kex;-
64 EC_POINT *client_public;-
65 EC_KEY *server_key = NULL;-
66 const EC_GROUP *group;-
67 const EC_POINT *public_key;-
68 BIGNUM *shared_secret = NULL;-
69 struct sshkey *server_host_private, *server_host_public;-
70 u_char *server_host_key_blob = NULL, *signature = NULL;-
71 u_char *kbuf = NULL;-
72 u_char hash[SSH_DIGEST_MAX_LENGTH];-
73 size_t slen, sbloblen;-
74 size_t klen = 0, hashlen;-
75 int r;-
76-
77 if ((server_key = EC_KEY_new_by_curve_name(kex->ec_nid)) == NULL) {
(server_key = ...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
78 r = SSH_ERR_ALLOC_FAIL;-
79 goto out;
never executed: goto out;
0
80 }-
81 if (EC_KEY_generate_key(server_key) != 1) {
EC_KEY_generat...rver_key) != 1Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
82 r = SSH_ERR_LIBCRYPTO_ERROR;-
83 goto out;
never executed: goto out;
0
84 }-
85 group = EC_KEY_get0_group(server_key);-
86-
87#ifdef DEBUG_KEXECDH-
88 fputs("server private key:\n", stderr);-
89 sshkey_dump_ec_key(server_key);-
90#endif-
91-
92 if (kex->load_host_public_key == NULL ||
kex->load_host...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
93 kex->load_host_private_key == NULL) {
kex->load_host...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
94 r = SSH_ERR_INVALID_ARGUMENT;-
95 goto out;
never executed: goto out;
0
96 }-
97 server_host_public = kex->load_host_public_key(kex->hostkey_type,-
98 kex->hostkey_nid, ssh);-
99 server_host_private = kex->load_host_private_key(kex->hostkey_type,-
100 kex->hostkey_nid, ssh);-
101 if (server_host_public == NULL) {
server_host_pu...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
102 r = SSH_ERR_NO_HOSTKEY_LOADED;-
103 goto out;
never executed: goto out;
0
104 }-
105 if ((client_public = EC_POINT_new(group)) == NULL) {
(client_public...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
106 r = SSH_ERR_ALLOC_FAIL;-
107 goto out;
never executed: goto out;
0
108 }-
109 if ((r = sshpkt_get_ec(ssh, client_public, group)) != 0 ||
(r = sshpkt_ge..., group)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
110 (r = sshpkt_get_end(ssh)) != 0)
(r = sshpkt_get_end(ssh)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
111 goto out;
never executed: goto out;
0
112-
113#ifdef DEBUG_KEXECDH-
114 fputs("client public key:\n", stderr);-
115 sshkey_dump_ec_point(group, client_public);-
116#endif-
117 if (sshkey_ec_validate_public(group, client_public) != 0) {
sshkey_ec_vali...t_public) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
118 sshpkt_disconnect(ssh, "invalid client public key");-
119 r = SSH_ERR_MESSAGE_INCOMPLETE;-
120 goto out;
never executed: goto out;
0
121 }-
122-
123 /* Calculate shared_secret */-
124 klen = (EC_GROUP_get_degree(group) + 7) / 8;-
125 if ((kbuf = malloc(klen)) == NULL ||
(kbuf = malloc...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
126 (shared_secret = BN_new()) == NULL) {
(shared_secret...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
127 r = SSH_ERR_ALLOC_FAIL;-
128 goto out;
never executed: goto out;
0
129 }-
130 if (ECDH_compute_key(kbuf, klen, client_public,
ECDH_compute_k...) != (int)klenDescription
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
131 server_key, NULL) != (int)klen ||
ECDH_compute_k...) != (int)klenDescription
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
132 BN_bin2bn(kbuf, klen, shared_secret) == NULL) {
BN_bin2bn(kbuf...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
133 r = SSH_ERR_LIBCRYPTO_ERROR;-
134 goto out;
never executed: goto out;
0
135 }-
136-
137#ifdef DEBUG_KEXECDH-
138 dump_digest("shared secret", kbuf, klen);-
139#endif-
140 /* calc H */-
141 if ((r = sshkey_to_blob(server_host_public, &server_host_key_blob,
(r = sshkey_to...bloblen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
142 &sbloblen)) != 0)
(r = sshkey_to...bloblen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
143 goto out;
never executed: goto out;
0
144 hashlen = sizeof(hash);-
145 if ((r = kex_ecdh_hash(
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
146 kex->hash_alg,
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
147 group,
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
148 kex->client_version_string,
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
149 kex->server_version_string,
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
150 sshbuf_ptr(kex->peer), sshbuf_len(kex->peer),
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
151 sshbuf_ptr(kex->my), sshbuf_len(kex->my),
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
152 server_host_key_blob, sbloblen,
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
153 client_public,
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
154 EC_KEY_get0_public_key(server_key),
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
155 shared_secret,
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
156 hash, &hashlen)) != 0)
(r = kex_ecdh_...hashlen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
157 goto out;
never executed: goto out;
0
158-
159 /* save session id := H */-
160 if (kex->session_id == NULL) {
kex->session_id == ((void *)0)Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • test_kex
FALSEevaluated 48 times by 1 test
Evaluated by:
  • test_kex
12-48
161 kex->session_id_len = hashlen;-
162 kex->session_id = malloc(kex->session_id_len);-
163 if (kex->session_id == NULL) {
kex->session_id == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • test_kex
0-12
164 r = SSH_ERR_ALLOC_FAIL;-
165 goto out;
never executed: goto out;
0
166 }-
167 memcpy(kex->session_id, hash, kex->session_id_len);-
168 }
executed 12 times by 1 test: end of block
Executed by:
  • test_kex
12
169-
170 /* sign H */-
171 if ((r = kex->sign(server_host_private, server_host_public, &signature,
(r = kex->sign...->compat)) < 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
172 &slen, hash, hashlen, kex->hostkey_alg, ssh->compat)) < 0)
(r = kex->sign...->compat)) < 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
173 goto out;
never executed: goto out;
0
174-
175 /* destroy_sensitive_data(); */-
176-
177 public_key = EC_KEY_get0_public_key(server_key);-
178 /* send server hostkey, ECDH pubkey 'Q_S' and signed H */-
179 if ((r = sshpkt_start(ssh, SSH2_MSG_KEX_ECDH_REPLY)) != 0 ||
(r = sshpkt_st...ssh, 31)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
180 (r = sshpkt_put_string(ssh, server_host_key_blob, sbloblen)) != 0 ||
(r = sshpkt_pu...bloblen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
181 (r = sshpkt_put_ec(ssh, public_key, group)) != 0 ||
(r = sshpkt_pu..., group)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
182 (r = sshpkt_put_string(ssh, signature, slen)) != 0 ||
(r = sshpkt_pu...e, slen)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
183 (r = sshpkt_send(ssh)) != 0)
(r = sshpkt_send(ssh)) != 0Description
TRUEnever evaluated
FALSEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
0-60
184 goto out;
never executed: goto out;
0
185-
186 if ((r = kex_derive_keys_bn(ssh, hash, hashlen, shared_secret)) == 0)
(r = kex_deriv..._secret)) == 0Description
TRUEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
FALSEnever evaluated
0-60
187 r = kex_send_newkeys(ssh);
executed 60 times by 1 test: r = kex_send_newkeys(ssh);
Executed by:
  • test_kex
60
188 out:
code before this statement executed 60 times by 1 test: out:
Executed by:
  • test_kex
60
189 explicit_bzero(hash, sizeof(hash));-
190 EC_KEY_free(kex->ec_client_key);-
191 kex->ec_client_key = NULL;-
192 EC_KEY_free(server_key);-
193 if (kbuf) {
kbufDescription
TRUEevaluated 60 times by 1 test
Evaluated by:
  • test_kex
FALSEnever evaluated
0-60
194 explicit_bzero(kbuf, klen);-
195 free(kbuf);-
196 }
executed 60 times by 1 test: end of block
Executed by:
  • test_kex
60
197 BN_clear_free(shared_secret);-
198 free(server_host_key_blob);-
199 free(signature);-
200 return r;
executed 60 times by 1 test: return r;
Executed by:
  • test_kex
60
201}-
202#endif /* defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC) */-
203-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2