sk-ed25519.c 1.8 KB

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