summaryrefslogtreecommitdiff
path: root/ecdsa.c
diff options
context:
space:
mode:
authoregor-duda <egor-duda@users.noreply.github.com>2022-01-22 16:53:04 +0300
committerGitHub <noreply@github.com>2022-01-22 21:53:04 +0800
commit5edd2ce32e83f04b985545554412cd3a03de5547 (patch)
treec8e1fd66a6f061635f22c5619358a5ea83d0eaaa /ecdsa.c
parent18be2a65097ed8ba75d4b78769a1774e18799644 (diff)
downloaddropbear-5edd2ce32e83f04b985545554412cd3a03de5547.tar.gz
Implement server-side support for sk-ecdsa U2F-backed keys (#142)
* Implement server-side support for sk-ecdsa U2F-backed keys * Fix out-of-bounds read on normal ecdsa-sha2-[identifier] keys * Fix one more potential out-of-bounds read * Check if nistp256 curve is used in sk-ecdsa-sha2- key It's the only allowed curve per PROTOCOL.u2f specification * Implement server-side support for sk-ed25519 FIDO2-backed keys * Keys with type sk-* make no sense as host keys, so they should be disabled * fix typo * Make sk-ecdsa call buf_ecdsa_verify This reduces code duplication, the SK code just handles the different message format. * Reduce sk specific code The application id can be stored in signkey, then we don't need to call sk-specific functions from svr-authpubkey * Remove debugging output, which causes compilation errors with DEBUG_TRACE disabled * Proper cleanup of sk_app Co-authored-by: Matt Johnston <matt@codeconstruct.com.au>
Diffstat (limited to 'ecdsa.c')
-rw-r--r--ecdsa.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/ecdsa.c b/ecdsa.c
index 56e5355..5ac4e7b 100644
--- a/ecdsa.c
+++ b/ecdsa.c
@@ -81,18 +81,25 @@ ecc_key *buf_get_ecdsa_pub_key(buffer* buf) {
struct dropbear_ecc_curve **curve;
ecc_key *new_key = NULL;
- /* string "ecdsa-sha2-[identifier]" */
+ /* string "ecdsa-sha2-[identifier]" or "sk-ecdsa-sha2-nistp256@openssh.com" */
key_ident = (unsigned char*)buf_getstring(buf, &key_ident_len);
/* string "[identifier]" */
identifier = (unsigned char*)buf_getstring(buf, &identifier_len);
- if (key_ident_len != identifier_len + strlen("ecdsa-sha2-")) {
- TRACE(("Bad identifier lengths"))
- goto out;
- }
- if (memcmp(&key_ident[strlen("ecdsa-sha2-")], identifier, identifier_len) != 0) {
- TRACE(("mismatching identifiers"))
- goto out;
+ if (strcmp (key_ident, "sk-ecdsa-sha2-nistp256@openssh.com") == 0) {
+ if (strcmp (identifier, "nistp256") != 0) {
+ TRACE(("mismatching identifiers"))
+ goto out;
+ }
+ } else {
+ if (key_ident_len != identifier_len + strlen ("ecdsa-sha2-")) {
+ TRACE(("Bad identifier lengths"))
+ goto out;
+ }
+ if (memcmp(&key_ident[strlen ("ecdsa-sha2-")], identifier, identifier_len) != 0) {
+ TRACE(("mismatching identifiers"))
+ goto out;
+ }
}
for (curve = dropbear_ecc_curves; *curve; curve++) {