Ed25519.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * Copyright (c) 2022, stelar7 <dudedbz@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/ByteBuffer.h>
  8. #include <LibCrypto/Curves/EllipticCurve.h>
  9. namespace Crypto::Curves {
  10. struct Ed25519Point {
  11. u32 x[8] {};
  12. u32 y[8] {};
  13. u32 z[8] {};
  14. u32 t[8] {};
  15. };
  16. class Ed25519 {
  17. public:
  18. static constexpr Ed25519Point BASE_POINT = {
  19. { 0x8F25D51A, 0xC9562D60, 0x9525A7B2, 0x692CC760, 0xFDD6DC5C, 0xC0A4E231, 0xCD6E53FE, 0x216936D3 },
  20. { 0x66666658, 0x66666666, 0x66666666, 0x66666666, 0x66666666, 0x66666666, 0x66666666, 0x66666666 },
  21. { 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
  22. { 0xA5B7DDA3, 0x6DDE8AB3, 0x775152F5, 0x20F09F80, 0x64ABE37D, 0x66EA4E8E, 0xD78B7665, 0x67875F0F }
  23. };
  24. size_t key_size() { return 32; }
  25. size_t signature_size() { return 64; }
  26. ErrorOr<ByteBuffer> generate_private_key();
  27. ErrorOr<ByteBuffer> generate_public_key(ReadonlyBytes private_key);
  28. ErrorOr<ByteBuffer> sign(ReadonlyBytes public_key, ReadonlyBytes private_key, ReadonlyBytes message);
  29. bool verify(ReadonlyBytes public_key, ReadonlyBytes signature, ReadonlyBytes message);
  30. private:
  31. void encode_point(Ed25519Point* point, u8* data);
  32. u32 decode_point(Ed25519Point* point, u8 const* data);
  33. void point_add(Ed25519Point* result, Ed25519Point const* p, Ed25519Point const* q);
  34. void point_double(Ed25519Point* result, Ed25519Point const* point);
  35. void point_multiply_scalar(Ed25519Point* result, u8 const* scalar, Ed25519Point const* point);
  36. void barrett_reduce(u8* result, u8 const* input);
  37. void add(u8* result, u8 const* a, u8 const* b, u8 n);
  38. u8 subtract(u8* result, u8 const* a, u8 const* b, u8 n);
  39. void multiply(u8* result_low, u8* result_high, u8 const* a, u8 const* b, u8 n);
  40. void select(u8* result, u8 const* a, u8 const* b, u8 c, u8 n);
  41. u8 compare(u8 const* a, u8 const* b, u8 n);
  42. void copy(u8* a, u8 const* b, u32 n);
  43. u8 k[64] {};
  44. u8 p[32] {};
  45. u8 r[32] {};
  46. u8 s[32] {};
  47. Ed25519Point ka {};
  48. Ed25519Point rb {};
  49. Ed25519Point sb {};
  50. Ed25519Point u {};
  51. Ed25519Point v {};
  52. u32 a[8] {};
  53. u32 b[8] {};
  54. u32 c[8] {};
  55. u32 d[8] {};
  56. u32 e[8] {};
  57. u32 f[8] {};
  58. u32 g[8] {};
  59. u32 h[8] {};
  60. };
  61. }