summaryrefslogtreecommitdiffstats
path: root/usr.bin/ssh/ssh-agent.c
diff options
context:
space:
mode:
authordjm <djm@openbsd.org>2019-11-15 05:37:27 +0000
committerdjm <djm@openbsd.org>2019-11-15 05:37:27 +0000
commit096d667cd04e1e26cd48b8c0535a3207bbda7ac9 (patch)
treec944e6a8ef497fbb25b0855a3ee977c23f663c59 /usr.bin/ssh/ssh-agent.c
parentrewrite c99-ism (diff)
downloadwireguard-openbsd-096d667cd04e1e26cd48b8c0535a3207bbda7ac9.tar.xz
wireguard-openbsd-096d667cd04e1e26cd48b8c0535a3207bbda7ac9.zip
unshield security key privkey before attempting signature in
agent. spotted by dtucker@
Diffstat (limited to 'usr.bin/ssh/ssh-agent.c')
-rw-r--r--usr.bin/ssh/ssh-agent.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/usr.bin/ssh/ssh-agent.c b/usr.bin/ssh/ssh-agent.c
index d7516d22eaf..91e69a1d01e 100644
--- a/usr.bin/ssh/ssh-agent.c
+++ b/usr.bin/ssh/ssh-agent.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-agent.c,v 1.245 2019/11/15 04:12:32 djm Exp $ */
+/* $OpenBSD: ssh-agent.c,v 1.246 2019/11/15 05:37:27 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -409,7 +409,7 @@ process_sign_request2(SocketEntry *e)
u_char *signature = NULL;
size_t dlen, slen = 0;
u_int compat = 0, flags;
- int r, ok = -1;
+ int was_shielded, r, r2, ok = -1;
struct sshbuf *msg;
struct sshkey *key = NULL;
struct identity *id;
@@ -432,9 +432,21 @@ process_sign_request2(SocketEntry *e)
goto send;
}
if (id->sk_provider != NULL) {
- if ((r = provider_sign(id->sk_provider, id->key, &signature,
+ was_shielded = sshkey_is_shielded(id->key);
+ if ((r = sshkey_unshield_private(id->key)) != 0) {
+ error("%s: unshield: %s", __func__, ssh_err(r));
+ goto send;
+ }
+ r = provider_sign(id->sk_provider, id->key, &signature,
&slen, data, dlen, agent_decode_alg(key, flags),
- compat)) != 0) {
+ compat);
+ if (was_shielded &&
+ (r2 = sshkey_shield_private(id->key)) != 0) {
+ error("%s: shield: %s", __func__, ssh_err(r));
+ r = r2;
+ goto send;
+ }
+ if (r != 0) {
error("%s: sign: %s", __func__, ssh_err(r));
goto send;
}