diff options
author | Matthew Vernon <mcv21@cam.ac.uk> | 2014-03-26 15:40:41 +0000 |
---|---|---|
committer | Matthew Vernon <mcv21@cam.ac.uk> | 2014-03-26 15:51:46 +0000 |
commit | 0789c0d760ff7a61156a5d567e9f8b9f8195ff6e (patch) | |
tree | ddb6377e86eb122c15c9fdcb67bed56c23cf028f /sshconnect.c | |
parent | c0c05f0952597c4c821c6cc658f029f5bfd6c68c (diff) | |
parent | 63d5fa28e16d96db6bac2dbe3fcecb65328f8966 (diff) |
merge patched into master
Diffstat (limited to 'sshconnect.c')
-rw-r--r-- | sshconnect.c | 77 |
1 files changed, 30 insertions, 47 deletions
diff --git a/sshconnect.c b/sshconnect.c index b8510d201..324f5e0a3 100644 --- a/sshconnect.c +++ b/sshconnect.c | |||
@@ -1218,63 +1218,46 @@ fail: | |||
1218 | return -1; | 1218 | return -1; |
1219 | } | 1219 | } |
1220 | 1220 | ||
1221 | static int | ||
1222 | check_host_key_sshfp(char *host, struct sockaddr *hostaddr, Key *host_key) | ||
1223 | { | ||
1224 | int rc = -1; | ||
1225 | int flags = 0; | ||
1226 | Key *raw_key = NULL; | ||
1227 | |||
1228 | if (!options.verify_host_key_dns) | ||
1229 | goto done; | ||
1230 | |||
1231 | /* XXX certs are not yet supported for DNS; try looking the raw key | ||
1232 | * up in the DNS anyway. | ||
1233 | */ | ||
1234 | if (key_is_cert(host_key)) { | ||
1235 | debug2("Extracting key from cert for SSHFP lookup"); | ||
1236 | raw_key = key_from_private(host_key); | ||
1237 | if (key_drop_cert(raw_key)) | ||
1238 | fatal("Couldn't drop certificate"); | ||
1239 | host_key = raw_key; | ||
1240 | } | ||
1241 | |||
1242 | if (verify_host_key_dns(host, hostaddr, host_key, &flags)) | ||
1243 | goto done; | ||
1244 | |||
1245 | if (flags & DNS_VERIFY_FOUND) { | ||
1246 | |||
1247 | if (options.verify_host_key_dns == 1 && | ||
1248 | flags & DNS_VERIFY_MATCH && | ||
1249 | flags & DNS_VERIFY_SECURE) { | ||
1250 | rc = 0; | ||
1251 | } else if (flags & DNS_VERIFY_MATCH) { | ||
1252 | matching_host_key_dns = 1; | ||
1253 | } else { | ||
1254 | warn_changed_key(host_key); | ||
1255 | error("Update the SSHFP RR in DNS with the new " | ||
1256 | "host key to get rid of this message."); | ||
1257 | } | ||
1258 | } | ||
1259 | |||
1260 | done: | ||
1261 | if (raw_key) | ||
1262 | key_free(raw_key); | ||
1263 | return rc; | ||
1264 | } | ||
1265 | |||
1266 | /* returns 0 if key verifies or -1 if key does NOT verify */ | 1221 | /* returns 0 if key verifies or -1 if key does NOT verify */ |
1267 | int | 1222 | int |
1268 | verify_host_key(char *host, struct sockaddr *hostaddr, Key *host_key) | 1223 | verify_host_key(char *host, struct sockaddr *hostaddr, Key *host_key) |
1269 | { | 1224 | { |
1225 | int flags = 0; | ||
1270 | char *fp; | 1226 | char *fp; |
1227 | Key *plain = NULL; | ||
1271 | 1228 | ||
1272 | fp = key_fingerprint(host_key, SSH_FP_MD5, SSH_FP_HEX); | 1229 | fp = key_fingerprint(host_key, SSH_FP_MD5, SSH_FP_HEX); |
1273 | debug("Server host key: %s %s", key_type(host_key), fp); | 1230 | debug("Server host key: %s %s", key_type(host_key), fp); |
1274 | free(fp); | 1231 | free(fp); |
1275 | 1232 | ||
1276 | if (check_host_key_sshfp(host, hostaddr, host_key) == 0) | 1233 | if (options.verify_host_key_dns) { |
1277 | return 0; | 1234 | /* |
1235 | * XXX certs are not yet supported for DNS, so downgrade | ||
1236 | * them and try the plain key. | ||
1237 | */ | ||
1238 | plain = key_from_private(host_key); | ||
1239 | if (key_is_cert(plain)) | ||
1240 | key_drop_cert(plain); | ||
1241 | if (verify_host_key_dns(host, hostaddr, plain, &flags) == 0) { | ||
1242 | if (flags & DNS_VERIFY_FOUND) { | ||
1243 | if (options.verify_host_key_dns == 1 && | ||
1244 | flags & DNS_VERIFY_MATCH && | ||
1245 | flags & DNS_VERIFY_SECURE) { | ||
1246 | key_free(plain); | ||
1247 | return 0; | ||
1248 | } | ||
1249 | if (flags & DNS_VERIFY_MATCH) { | ||
1250 | matching_host_key_dns = 1; | ||
1251 | } else { | ||
1252 | warn_changed_key(plain); | ||
1253 | error("Update the SSHFP RR in DNS " | ||
1254 | "with the new host key to get rid " | ||
1255 | "of this message."); | ||
1256 | } | ||
1257 | } | ||
1258 | } | ||
1259 | key_free(plain); | ||
1260 | } | ||
1278 | 1261 | ||
1279 | return check_host_key(host, hostaddr, options.port, host_key, RDRW, | 1262 | return check_host_key(host, hostaddr, options.port, host_key, RDRW, |
1280 | options.user_hostfiles, options.num_user_hostfiles, | 1263 | options.user_hostfiles, options.num_user_hostfiles, |