Check if nistp256 curve is used in sk-ecdsa-sha2- key

It's the only allowed curve per PROTOCOL.u2f specification
This commit is contained in:
Egor Duda 2021-12-24 14:26:09 +03:00
parent 2993eedaba
commit 0c62c0db7f
No known key found for this signature in database
GPG Key ID: 8610EBBBC18A37F1

35
ecdsa.c
View File

@ -76,33 +76,30 @@ ecc_key *gen_ecdsa_priv_key(unsigned int bit_size) {
ecc_key *buf_get_ecdsa_pub_key(buffer* buf) { ecc_key *buf_get_ecdsa_pub_key(buffer* buf) {
unsigned char *key_ident = NULL, *identifier = NULL; unsigned char *key_ident = NULL, *identifier = NULL;
unsigned int key_ident_len, identifier_len, prefix_len, rest_len; unsigned int key_ident_len, identifier_len;
buffer *q_buf = NULL; buffer *q_buf = NULL;
struct dropbear_ecc_curve **curve; struct dropbear_ecc_curve **curve;
ecc_key *new_key = NULL; ecc_key *new_key = NULL;
/* string "ecdsa-sha2-[identifier]" or "sk-ecdsa-sha2-[identifier]@openssh.com" */ /* string "ecdsa-sha2-[identifier]" or "sk-ecdsa-sha2-nistp256@openssh.com" */
key_ident = (unsigned char*)buf_getstring(buf, &key_ident_len); key_ident = (unsigned char*)buf_getstring(buf, &key_ident_len);
/* string "[identifier]" */ /* string "[identifier]" */
identifier = (unsigned char*)buf_getstring(buf, &identifier_len); identifier = (unsigned char*)buf_getstring(buf, &identifier_len);
prefix_len = strlen ("ecdsa-sha2-"); if (strcmp (key_ident, "sk-ecdsa-sha2-nistp256@openssh.com") == 0) {
rest_len = prefix_len; if (strcmp (identifier, "nistp256") != 0) {
TRACE(("mismatching identifiers"))
#if DROPBEAR_SK_ECDSA goto out;
if (strncmp (key_ident, "sk-", 3) == 0) { }
prefix_len = strlen ("sk-ecdsa-sha2-"); } else {
rest_len = prefix_len + strlen ("@openssh.com"); if (key_ident_len != identifier_len + strlen ("ecdsa-sha2-")) {
} TRACE(("Bad identifier lengths"))
#endif goto out;
}
if (key_ident_len != identifier_len + rest_len) { if (memcmp(&key_ident[strlen ("ecdsa-sha2-")], identifier, identifier_len) != 0) {
TRACE(("Bad identifier lengths")) TRACE(("mismatching identifiers"))
goto out; goto out;
} }
if (memcmp(&key_ident[prefix_len], identifier, identifier_len) != 0) {
TRACE(("mismatching identifiers"))
goto out;
} }
for (curve = dropbear_ecc_curves; *curve; curve++) { for (curve = dropbear_ecc_curves; *curve; curve++) {