summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2022-03-30 21:06:15 +0800
committerMatt Johnston <matt@ucc.asn.au>2022-03-30 21:06:15 +0800
commit18eb365ddddb15f280981b3df204524ff057ab0d (patch)
treed86ab284bd9c87cb2d72892c09c7358e13993210
parent63335a1db225f7dfd61f8212e19ce3353031a9c5 (diff)
downloaddropbear-18eb365ddddb15f280981b3df204524ff057ab0d.tar.gz
Handle ecdsa-sk flags, reject no-touch
For the time being Dropbear will only allow SK auth with default parameters, user-presence needs to be set. In future handling of authorized_keys option "no-touch-required" can be added. This code would also be refactored to share between ecdsa and ed25519 once I get hardware/emulation to test ed25519.
-rw-r--r--sk-ecdsa.c9
-rw-r--r--sk-ed25519.c13
-rw-r--r--ssh.h5
3 files changed, 24 insertions, 3 deletions
diff --git a/sk-ecdsa.c b/sk-ecdsa.c
index 2d4a0ff..bd4d353 100644
--- a/sk-ecdsa.c
+++ b/sk-ecdsa.c
@@ -6,6 +6,7 @@
#include "ecc.h"
#include "ecdsa.h"
#include "sk-ecdsa.h"
+#include "ssh.h"
int buf_sk_ecdsa_verify(buffer *buf, const ecc_key *key, const buffer *data_buf, const char* app, unsigned int applen) {
hash_state hs;
@@ -40,6 +41,14 @@ int buf_sk_ecdsa_verify(buffer *buf, const ecc_key *key, const buffer *data_buf,
buf_free(sk_buffer);
buf_free(sig_buffer);
+ /* TODO: allow "no-touch-required" or "verify-required" authorized_keys options */
+ if (!(flags & SSH_SK_USER_PRESENCE_REQD)) {
+ if (ret == DROPBEAR_SUCCESS) {
+ dropbear_log(LOG_WARNING, "Rejecting, user-presence not set");
+ }
+ ret = DROPBEAR_FAILURE;
+ }
+
TRACE(("leave buf_sk_ecdsa_verify, ret=%d", ret))
return ret;
}
diff --git a/sk-ed25519.c b/sk-ed25519.c
index 9da9606..902a5e6 100644
--- a/sk-ed25519.c
+++ b/sk-ed25519.c
@@ -6,6 +6,7 @@
#include "buffer.h"
#include "curve25519.h"
#include "ed25519.h"
+#include "ssh.h"
int buf_sk_ed25519_verify(buffer *buf, const dropbear_ed25519_key *key, const buffer *data_buf, const char* app, unsigned int applen) {
@@ -31,6 +32,7 @@ int buf_sk_ed25519_verify(buffer *buf, const dropbear_ed25519_key *key, const bu
flags = buf_getbyte (buf);
counter = buf_getint (buf);
+ /* create the message to be signed */
sk_buffer = buf_new (2*SHA256_HASH_SIZE+5);
sha256_init (&hs);
sha256_process (&hs, app, applen);
@@ -50,10 +52,15 @@ int buf_sk_ed25519_verify(buffer *buf, const dropbear_ed25519_key *key, const bu
ret = DROPBEAR_SUCCESS;
}
-out:
- if (sk_buffer) {
- buf_free(sk_buffer);
+ /* TODO: allow "no-touch-required" or "verify-required" authorized_keys options */
+ if (!(flags & SSH_SK_USER_PRESENCE_REQD)) {
+ if (ret == DROPBEAR_SUCCESS) {
+ dropbear_log(LOG_WARNING, "Rejecting, user-presence not set");
+ }
+ ret = DROPBEAR_FAILURE;
}
+out:
+ buf_free(sk_buffer);
TRACE(("leave buf_sk_ed25519_verify: ret %d", ret))
return ret;
}
diff --git a/ssh.h b/ssh.h
index ee4a960..1b4fec6 100644
--- a/ssh.h
+++ b/ssh.h
@@ -126,3 +126,8 @@
#define SSH2_AGENT_SIGN_RESPONSE 14
#define SSH2_AGENT_FAILURE 30
+
+/* Flags defined by OpenSSH U2F key/signature format */
+#define SSH_SK_USER_PRESENCE_REQD 0x01
+#define SSH_SK_USER_VERIFICATION_REQD 0x04
+#define SSH_SK_RESIDENT_KEY 0x20