/src/dropbear/src/sk-ed25519.c
Line | Count | Source (jump to first uncovered line) |
1 | | #include "includes.h" |
2 | | |
3 | | #if DROPBEAR_SK_ED25519 |
4 | | |
5 | | #include "dbutil.h" |
6 | | #include "buffer.h" |
7 | | #include "curve25519.h" |
8 | | #include "ed25519.h" |
9 | | #include "ssh.h" |
10 | | |
11 | | int buf_sk_ed25519_verify(buffer *buf, const dropbear_ed25519_key *key, const buffer *data_buf, |
12 | | const char* app, unsigned int applen, |
13 | 0 | unsigned char sk_flags_mask) { |
14 | |
|
15 | 0 | int ret = DROPBEAR_FAILURE; |
16 | 0 | unsigned char *s; |
17 | 0 | unsigned long slen; |
18 | 0 | hash_state hs; |
19 | 0 | unsigned char hash[SHA256_HASH_SIZE]; |
20 | 0 | buffer *sk_buffer = NULL; |
21 | 0 | unsigned char flags; |
22 | 0 | unsigned int counter; |
23 | |
|
24 | 0 | TRACE(("enter buf_sk_ed25519_verify")) |
25 | 0 | dropbear_assert(key != NULL); |
26 | | |
27 | 0 | slen = buf_getint(buf); |
28 | 0 | if (slen != 64 || buf->len - buf->pos < slen) { |
29 | 0 | TRACE(("leave buf_sk_ed25519_verify: bad size")) |
30 | 0 | goto out; |
31 | 0 | } |
32 | 0 | s = buf_getptr(buf, slen); |
33 | 0 | buf_incrpos(buf, slen); |
34 | |
|
35 | 0 | flags = buf_getbyte (buf); |
36 | 0 | counter = buf_getint (buf); |
37 | | /* create the message to be signed */ |
38 | 0 | sk_buffer = buf_new (2*SHA256_HASH_SIZE+5); |
39 | 0 | sha256_init (&hs); |
40 | 0 | sha256_process (&hs, app, applen); |
41 | 0 | sha256_done (&hs, hash); |
42 | 0 | buf_putbytes (sk_buffer, hash, sizeof (hash)); |
43 | 0 | buf_putbyte (sk_buffer, flags); |
44 | 0 | buf_putint (sk_buffer, counter); |
45 | 0 | sha256_init (&hs); |
46 | 0 | sha256_process (&hs, data_buf->data, data_buf->len); |
47 | 0 | sha256_done (&hs, hash); |
48 | 0 | buf_putbytes (sk_buffer, hash, sizeof (hash)); |
49 | |
|
50 | 0 | if (dropbear_ed25519_verify(sk_buffer->data, sk_buffer->len, |
51 | 0 | s, slen, key->pub) == 0) { |
52 | | /* signature is valid */ |
53 | 0 | TRACE(("leave buf_sk_ed25519_verify: success!")) |
54 | 0 | ret = DROPBEAR_SUCCESS; |
55 | 0 | } |
56 | |
|
57 | 0 | if (~flags & sk_flags_mask & SSH_SK_USER_PRESENCE_REQD) { |
58 | 0 | if (ret == DROPBEAR_SUCCESS) { |
59 | 0 | dropbear_log(LOG_WARNING, "Rejecting, user-presence not set"); |
60 | 0 | } |
61 | 0 | ret = DROPBEAR_FAILURE; |
62 | 0 | } |
63 | 0 | if (~flags & sk_flags_mask & SSH_SK_USER_VERIFICATION_REQD) { |
64 | 0 | if (ret == DROPBEAR_SUCCESS) { |
65 | 0 | dropbear_log(LOG_WARNING, "Rejecting, user-verification not set"); |
66 | 0 | } |
67 | 0 | ret = DROPBEAR_FAILURE; |
68 | 0 | } |
69 | 0 | out: |
70 | 0 | buf_free(sk_buffer); |
71 | 0 | TRACE(("leave buf_sk_ed25519_verify: ret %d", ret)) |
72 | 0 | return ret; |
73 | 0 | } |
74 | | |
75 | | #endif /* DROPBEAR_SK_ED25519 */ |