Mercurial > dropbear
annotate svr-kex.c @ 994:5c5ade336926
Prefer stronger algorithms in algorithm negotiation.
Prefer diffie-hellman-group14-sha1 (2048 bit) over
diffie-hellman-group1-sha1 (1024 bit).
Due to meet-in-the-middle attacks the effective key length of
three key 3DES is 112 bits. AES is stronger and faster then 3DES.
Prefer to delay the start of compression until after authentication
has completed. This avoids exposing compression code to attacks
from unauthenticated users.
(github pull request #9)
author | Fedor Brunner <fedor.brunner@azet.sk> |
---|---|
date | Fri, 23 Jan 2015 23:00:25 +0800 |
parents | 2b62f26cf808 |
children | aaf576b27a10 |
rev | line source |
---|---|
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
1 /* |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
2 * Dropbear - a SSH2 server |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
3 * |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
4 * Copyright (c) 2002,2003 Matt Johnston |
74
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
26
diff
changeset
|
5 * Copyright (c) 2004 by Mihnea Stoenescu |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
6 * All rights reserved. |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
7 * |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
8 * Permission is hereby granted, free of charge, to any person obtaining a copy |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
9 * of this software and associated documentation files (the "Software"), to deal |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
10 * in the Software without restriction, including without limitation the rights |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
12 * copies of the Software, and to permit persons to whom the Software is |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
13 * furnished to do so, subject to the following conditions: |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
14 * |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
15 * The above copyright notice and this permission notice shall be included in |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
16 * all copies or substantial portions of the Software. |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
17 * |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
24 * SOFTWARE. */ |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
25 |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
26 #include "includes.h" |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
27 #include "dbutil.h" |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
28 #include "algo.h" |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
29 #include "buffer.h" |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
30 #include "session.h" |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
31 #include "kex.h" |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
32 #include "ssh.h" |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
33 #include "packet.h" |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
34 #include "bignum.h" |
858
220f55d540ae
rename random.h to dbrandom.h since some OSes have a system random.h
Matt Johnston <matt@ucc.asn.au>
parents:
852
diff
changeset
|
35 #include "dbrandom.h" |
24 | 36 #include "runopts.h" |
761
ac2158e3e403
ecc kind of works, needs fixing/testing
Matt Johnston <matt@ucc.asn.au>
parents:
759
diff
changeset
|
37 #include "ecc.h" |
846
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
38 #include "gensignkey.h" |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
39 |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
40 static void send_msg_kexdh_reply(mp_int *dh_e, buffer *ecdh_qs); |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
41 |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
42 /* Handle a diffie-hellman key exchange initialisation. This involves |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
43 * calculating a session key reply value, and corresponding hash. These |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
44 * are carried out by send_msg_kexdh_reply(). recv_msg_kexdh_init() calls |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
45 * that function, then brings the new keys into use */ |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
46 void recv_msg_kexdh_init() { |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
47 |
84
29a5c7c62350
default initialisers for mp_ints
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
48 DEF_MP_INT(dh_e); |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
49 buffer *ecdh_qs = NULL; |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
50 |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
84
diff
changeset
|
51 TRACE(("enter recv_msg_kexdh_init")) |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
52 if (!ses.kexstate.recvkexinit) { |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
53 dropbear_exit("Premature kexdh_init message received"); |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
54 } |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
55 |
848 | 56 switch (ses.newkeys->algo_kex->mode) { |
57 case DROPBEAR_KEX_NORMAL_DH: | |
58 m_mp_init(&dh_e); | |
59 if (buf_getmpint(ses.payload, &dh_e) != DROPBEAR_SUCCESS) { | |
60 dropbear_exit("Bad kex value"); | |
61 } | |
62 break; | |
63 case DROPBEAR_KEX_ECDH: | |
64 case DROPBEAR_KEX_CURVE25519: | |
65 #if defined(DROPBEAR_ECDH) || defined(DROPBEAR_CURVE25519) | |
66 ecdh_qs = buf_getstringbuf(ses.payload); | |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
67 #endif |
848 | 68 break; |
340 | 69 } |
852
7540c0822374
Various cleanups and fixes for warnings
Matt Johnston <matt@ucc.asn.au>
parents:
850
diff
changeset
|
70 if (ses.payload->pos != ses.payload->len) { |
7540c0822374
Various cleanups and fixes for warnings
Matt Johnston <matt@ucc.asn.au>
parents:
850
diff
changeset
|
71 dropbear_exit("Bad kex value"); |
7540c0822374
Various cleanups and fixes for warnings
Matt Johnston <matt@ucc.asn.au>
parents:
850
diff
changeset
|
72 } |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
73 |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
74 send_msg_kexdh_reply(&dh_e, ecdh_qs); |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
75 |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
76 mp_clear(&dh_e); |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
77 if (ecdh_qs) { |
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
78 buf_free(ecdh_qs); |
852
7540c0822374
Various cleanups and fixes for warnings
Matt Johnston <matt@ucc.asn.au>
parents:
850
diff
changeset
|
79 ecdh_qs = NULL; |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
80 } |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
81 |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
82 send_msg_newkeys(); |
886
cbc73a5aefb0
requirenext doesn't need two values
Matt Johnston <matt@ucc.asn.au>
parents:
875
diff
changeset
|
83 ses.requirenext = SSH_MSG_NEWKEYS; |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
84
diff
changeset
|
84 TRACE(("leave recv_msg_kexdh_init")) |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
85 } |
846
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
86 |
982
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
87 |
847
f4bb964c8678
Add '-R' for delayed hostkey option
Matt Johnston <matt@ucc.asn.au>
parents:
846
diff
changeset
|
88 #ifdef DROPBEAR_DELAY_HOSTKEY |
982
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
89 |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
90 static void fsync_parent_dir(const char* fn) { |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
91 #ifdef HAVE_LIBGEN_H |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
92 char *fn_dir = m_strdup(fn); |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
93 char *dir = dirname(fn_dir); |
983
2b62f26cf808
Open directories O_RDONLY for fsync, add debugging if it fails
Matt Johnston <matt@ucc.asn.au>
parents:
982
diff
changeset
|
94 int dirfd = open(dir, O_RDONLY); |
982
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
95 |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
96 if (dirfd != -1) { |
983
2b62f26cf808
Open directories O_RDONLY for fsync, add debugging if it fails
Matt Johnston <matt@ucc.asn.au>
parents:
982
diff
changeset
|
97 if (fsync(dirfd) != 0) { |
2b62f26cf808
Open directories O_RDONLY for fsync, add debugging if it fails
Matt Johnston <matt@ucc.asn.au>
parents:
982
diff
changeset
|
98 TRACE(("fsync of directory %s failed: %s", dir, strerror(errno))) |
2b62f26cf808
Open directories O_RDONLY for fsync, add debugging if it fails
Matt Johnston <matt@ucc.asn.au>
parents:
982
diff
changeset
|
99 } |
982
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
100 m_close(dirfd); |
983
2b62f26cf808
Open directories O_RDONLY for fsync, add debugging if it fails
Matt Johnston <matt@ucc.asn.au>
parents:
982
diff
changeset
|
101 } else { |
2b62f26cf808
Open directories O_RDONLY for fsync, add debugging if it fails
Matt Johnston <matt@ucc.asn.au>
parents:
982
diff
changeset
|
102 TRACE(("error opening directory %s for fsync: %s", dir, strerror(errno))) |
982
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
103 } |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
104 |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
105 free(fn_dir); |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
106 #endif |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
107 } |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
108 |
846
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
109 static void svr_ensure_hostkey() { |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
110 |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
111 const char* fn = NULL; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
112 char *fn_temp = NULL; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
113 enum signkey_type type = ses.newkeys->algo_hostkey; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
114 void **hostkey = signkey_key_ptr(svr_opts.hostkey, type); |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
115 int ret = DROPBEAR_FAILURE; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
116 |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
117 if (hostkey && *hostkey) { |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
118 return; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
119 } |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
120 |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
121 switch (type) |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
122 { |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
123 #ifdef DROPBEAR_RSA |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
124 case DROPBEAR_SIGNKEY_RSA: |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
125 fn = RSA_PRIV_FILENAME; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
126 break; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
127 #endif |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
128 #ifdef DROPBEAR_DSS |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
129 case DROPBEAR_SIGNKEY_DSS: |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
130 fn = DSS_PRIV_FILENAME; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
131 break; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
132 #endif |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
133 #ifdef DROPBEAR_ECDSA |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
134 case DROPBEAR_SIGNKEY_ECDSA_NISTP256: |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
135 case DROPBEAR_SIGNKEY_ECDSA_NISTP384: |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
136 case DROPBEAR_SIGNKEY_ECDSA_NISTP521: |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
137 fn = ECDSA_PRIV_FILENAME; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
138 break; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
139 #endif |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
140 default: |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
141 (void)0; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
142 } |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
143 |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
144 if (readhostkey(fn, svr_opts.hostkey, &type) == DROPBEAR_SUCCESS) { |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
145 return; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
146 } |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
147 |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
148 fn_temp = m_malloc(strlen(fn) + 20); |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
149 snprintf(fn_temp, strlen(fn)+20, "%s.tmp%d", fn, getpid()); |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
150 |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
151 if (signkey_generate(type, 0, fn_temp) == DROPBEAR_FAILURE) { |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
152 goto out; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
153 } |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
154 |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
155 if (link(fn_temp, fn) < 0) { |
852
7540c0822374
Various cleanups and fixes for warnings
Matt Johnston <matt@ucc.asn.au>
parents:
850
diff
changeset
|
156 /* It's OK to get EEXIST - we probably just lost a race |
7540c0822374
Various cleanups and fixes for warnings
Matt Johnston <matt@ucc.asn.au>
parents:
850
diff
changeset
|
157 with another connection to generate the key */ |
846
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
158 if (errno != EEXIST) { |
852
7540c0822374
Various cleanups and fixes for warnings
Matt Johnston <matt@ucc.asn.au>
parents:
850
diff
changeset
|
159 dropbear_log(LOG_ERR, "Failed moving key file to %s: %s", fn, |
7540c0822374
Various cleanups and fixes for warnings
Matt Johnston <matt@ucc.asn.au>
parents:
850
diff
changeset
|
160 strerror(errno)); |
846
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
161 /* XXX fallback to non-atomic copy for some filesystems? */ |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
162 goto out; |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
163 } |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
164 } |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
165 |
982
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
166 /* ensure directory update is flushed to disk, otherwise we can end up |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
167 with zero-byte hostkey files if the power goes off */ |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
168 fsync_parent_dir(fn); |
fd2e8bbb0333
Make sure hostkeys are flushed to disk to avoid empty files if the power
Matt Johnston <matt@ucc.asn.au>
parents:
886
diff
changeset
|
169 |
846
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
170 ret = readhostkey(fn, svr_opts.hostkey, &type); |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
171 |
875
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
172 if (ret == DROPBEAR_SUCCESS) { |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
173 char *fp = NULL; |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
174 unsigned int len; |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
175 buffer *key_buf = buf_new(MAX_PUBKEY_SIZE); |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
176 buf_put_pub_key(key_buf, svr_opts.hostkey, type); |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
177 buf_setpos(key_buf, 4); |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
178 len = key_buf->len - key_buf->pos; |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
179 fp = sign_key_fingerprint(buf_getptr(key_buf, len), len); |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
180 dropbear_log(LOG_INFO, "Generated hostkey %s, fingerprint is %s", |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
181 fn, fp); |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
182 m_free(fp); |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
183 buf_free(key_buf); |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
184 } |
6c7a15668d5a
Log when generating a hostkey
Matt Johnston <matt@ucc.asn.au>
parents:
858
diff
changeset
|
185 |
846
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
186 out: |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
187 if (fn_temp) { |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
188 unlink(fn_temp); |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
189 m_free(fn_temp); |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
190 } |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
191 |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
192 if (ret == DROPBEAR_FAILURE) |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
193 { |
847
f4bb964c8678
Add '-R' for delayed hostkey option
Matt Johnston <matt@ucc.asn.au>
parents:
846
diff
changeset
|
194 dropbear_exit("Couldn't read or generate hostkey %s", fn); |
846
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
195 } |
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
196 } |
847
f4bb964c8678
Add '-R' for delayed hostkey option
Matt Johnston <matt@ucc.asn.au>
parents:
846
diff
changeset
|
197 #endif |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
198 |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
199 /* Generate our side of the diffie-hellman key exchange value (dh_f), and |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
200 * calculate the session key using the diffie-hellman algorithm. Following |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
201 * that, the session hash is calculated, and signed with RSA or DSS. The |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
202 * result is sent to the client. |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
203 * |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
204 * See the transport RFC4253 section 8 for details |
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
205 * or RFC5656 section 4 for elliptic curve variant. */ |
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
206 static void send_msg_kexdh_reply(mp_int *dh_e, buffer *ecdh_qs) { |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
84
diff
changeset
|
207 TRACE(("enter send_msg_kexdh_reply")) |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
208 |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
209 /* we can start creating the kexdh_reply packet */ |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
210 CHECKCLEARTOWRITE(); |
847
f4bb964c8678
Add '-R' for delayed hostkey option
Matt Johnston <matt@ucc.asn.au>
parents:
846
diff
changeset
|
211 |
f4bb964c8678
Add '-R' for delayed hostkey option
Matt Johnston <matt@ucc.asn.au>
parents:
846
diff
changeset
|
212 #ifdef DROPBEAR_DELAY_HOSTKEY |
f4bb964c8678
Add '-R' for delayed hostkey option
Matt Johnston <matt@ucc.asn.au>
parents:
846
diff
changeset
|
213 if (svr_opts.delay_hostkey) |
f4bb964c8678
Add '-R' for delayed hostkey option
Matt Johnston <matt@ucc.asn.au>
parents:
846
diff
changeset
|
214 { |
f4bb964c8678
Add '-R' for delayed hostkey option
Matt Johnston <matt@ucc.asn.au>
parents:
846
diff
changeset
|
215 svr_ensure_hostkey(); |
f4bb964c8678
Add '-R' for delayed hostkey option
Matt Johnston <matt@ucc.asn.au>
parents:
846
diff
changeset
|
216 } |
f4bb964c8678
Add '-R' for delayed hostkey option
Matt Johnston <matt@ucc.asn.au>
parents:
846
diff
changeset
|
217 #endif |
846
b298bb438625
refactor key generation, make it generate as required.
Matt Johnston <matt@ucc.asn.au>
parents:
801
diff
changeset
|
218 |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
219 buf_putbyte(ses.writepayload, SSH_MSG_KEXDH_REPLY); |
24 | 220 buf_put_pub_key(ses.writepayload, svr_opts.hostkey, |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
221 ses.newkeys->algo_hostkey); |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
222 |
848 | 223 switch (ses.newkeys->algo_kex->mode) { |
224 case DROPBEAR_KEX_NORMAL_DH: | |
225 { | |
226 struct kex_dh_param * dh_param = gen_kexdh_param(); | |
227 kexdh_comb_key(dh_param, dh_e, svr_opts.hostkey); | |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
228 |
848 | 229 /* put f */ |
230 buf_putmpint(ses.writepayload, &dh_param->pub); | |
231 free_kexdh_param(dh_param); | |
232 } | |
233 break; | |
234 case DROPBEAR_KEX_ECDH: | |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
235 #ifdef DROPBEAR_ECDH |
848 | 236 { |
237 struct kex_ecdh_param *ecdh_param = gen_kexecdh_param(); | |
238 kexecdh_comb_key(ecdh_param, ecdh_qs, svr_opts.hostkey); | |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
239 |
848 | 240 buf_put_ecc_raw_pubkey_string(ses.writepayload, &ecdh_param->key); |
241 free_kexecdh_param(ecdh_param); | |
242 } | |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
243 #endif |
848 | 244 break; |
245 case DROPBEAR_KEX_CURVE25519: | |
246 #ifdef DROPBEAR_CURVE25519 | |
247 { | |
849 | 248 struct kex_curve25519_param *param = gen_kexcurve25519_param(); |
848 | 249 kexcurve25519_comb_key(param, ecdh_qs, svr_opts.hostkey); |
850
7507b174bba0
- Make curve25519 work after fixing a typo, interoperates with OpenSSH
Matt Johnston <matt@ucc.asn.au>
parents:
849
diff
changeset
|
250 buf_putstring(ses.writepayload, param->pub, CURVE25519_LEN); |
848 | 251 free_kexcurve25519_param(param); |
252 } | |
253 #endif | |
254 break; | |
755
b07eb3dc23ec
refactor kexdh code a bit, start working on ecdh etc
Matt Johnston <matt@ucc.asn.au>
parents:
603
diff
changeset
|
255 } |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
256 |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
257 /* calc the signature */ |
24 | 258 buf_put_sign(ses.writepayload, svr_opts.hostkey, |
761
ac2158e3e403
ecc kind of works, needs fixing/testing
Matt Johnston <matt@ucc.asn.au>
parents:
759
diff
changeset
|
259 ses.newkeys->algo_hostkey, ses.hash); |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
260 |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
261 /* the SSH_MSG_KEXDH_REPLY is done */ |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
262 encrypt_packet(); |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
263 |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
84
diff
changeset
|
264 TRACE(("leave send_msg_kexdh_reply")) |
4
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
265 } |
fe6bca95afa7
Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
266 |