nanocurrency 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +7 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +40 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +43 -0
  10. data/Rakefile +16 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/ext/.DS_Store +0 -0
  14. data/ext/nanocurrency_ext/blake2-config.h +72 -0
  15. data/ext/nanocurrency_ext/blake2-impl.h +160 -0
  16. data/ext/nanocurrency_ext/blake2.h +195 -0
  17. data/ext/nanocurrency_ext/blake2b-load-sse2.h +68 -0
  18. data/ext/nanocurrency_ext/blake2b-load-sse41.h +402 -0
  19. data/ext/nanocurrency_ext/blake2b-ref.c +373 -0
  20. data/ext/nanocurrency_ext/blake2b-round.h +157 -0
  21. data/ext/nanocurrency_ext/curve25519-donna-32bit.h +579 -0
  22. data/ext/nanocurrency_ext/curve25519-donna-64bit.h +413 -0
  23. data/ext/nanocurrency_ext/curve25519-donna-helpers.h +67 -0
  24. data/ext/nanocurrency_ext/curve25519-donna-sse2.h +1112 -0
  25. data/ext/nanocurrency_ext/ed25519-donna-32bit-sse2.h +513 -0
  26. data/ext/nanocurrency_ext/ed25519-donna-32bit-tables.h +61 -0
  27. data/ext/nanocurrency_ext/ed25519-donna-64bit-sse2.h +436 -0
  28. data/ext/nanocurrency_ext/ed25519-donna-64bit-tables.h +53 -0
  29. data/ext/nanocurrency_ext/ed25519-donna-64bit-x86-32bit.h +435 -0
  30. data/ext/nanocurrency_ext/ed25519-donna-64bit-x86.h +351 -0
  31. data/ext/nanocurrency_ext/ed25519-donna-basepoint-table.h +259 -0
  32. data/ext/nanocurrency_ext/ed25519-donna-batchverify.h +275 -0
  33. data/ext/nanocurrency_ext/ed25519-donna-impl-base.h +364 -0
  34. data/ext/nanocurrency_ext/ed25519-donna-impl-sse2.h +390 -0
  35. data/ext/nanocurrency_ext/ed25519-donna-portable-identify.h +103 -0
  36. data/ext/nanocurrency_ext/ed25519-donna-portable.h +135 -0
  37. data/ext/nanocurrency_ext/ed25519-donna.h +115 -0
  38. data/ext/nanocurrency_ext/ed25519-hash-custom.c +28 -0
  39. data/ext/nanocurrency_ext/ed25519-hash-custom.h +30 -0
  40. data/ext/nanocurrency_ext/ed25519-hash.h +219 -0
  41. data/ext/nanocurrency_ext/ed25519-randombytes-custom.h +10 -0
  42. data/ext/nanocurrency_ext/ed25519-randombytes.h +91 -0
  43. data/ext/nanocurrency_ext/ed25519.c +150 -0
  44. data/ext/nanocurrency_ext/ed25519.h +30 -0
  45. data/ext/nanocurrency_ext/extconf.rb +3 -0
  46. data/ext/nanocurrency_ext/fuzz/README.md +173 -0
  47. data/ext/nanocurrency_ext/fuzz/build-nix.php +134 -0
  48. data/ext/nanocurrency_ext/fuzz/curve25519-ref10.c +1272 -0
  49. data/ext/nanocurrency_ext/fuzz/curve25519-ref10.h +8 -0
  50. data/ext/nanocurrency_ext/fuzz/ed25519-donna-sse2.c +3 -0
  51. data/ext/nanocurrency_ext/fuzz/ed25519-donna.c +1 -0
  52. data/ext/nanocurrency_ext/fuzz/ed25519-donna.h +34 -0
  53. data/ext/nanocurrency_ext/fuzz/ed25519-ref10.c +4647 -0
  54. data/ext/nanocurrency_ext/fuzz/ed25519-ref10.h +9 -0
  55. data/ext/nanocurrency_ext/fuzz/fuzz-curve25519.c +172 -0
  56. data/ext/nanocurrency_ext/fuzz/fuzz-ed25519.c +219 -0
  57. data/ext/nanocurrency_ext/modm-donna-32bit.h +469 -0
  58. data/ext/nanocurrency_ext/modm-donna-64bit.h +361 -0
  59. data/ext/nanocurrency_ext/rbext.c +164 -0
  60. data/ext/nanocurrency_ext/regression.h +1024 -0
  61. data/lib/nano/account.rb +59 -0
  62. data/lib/nano/base32.rb +87 -0
  63. data/lib/nano/block.rb +142 -0
  64. data/lib/nano/check.rb +65 -0
  65. data/lib/nano/conversion.rb +102 -0
  66. data/lib/nano/hash.rb +43 -0
  67. data/lib/nano/key.rb +69 -0
  68. data/lib/nano/utils.rb +45 -0
  69. data/lib/nano/work.rb +51 -0
  70. data/lib/nanocurrency.rb +7 -0
  71. data/lib/nanocurrency/version.rb +3 -0
  72. data/lib/nanocurrency_ext.bundle +0 -0
  73. data/nanocurrency.gemspec +44 -0
  74. metadata +192 -0
@@ -0,0 +1,135 @@
1
+ #include "ed25519-donna-portable-identify.h"
2
+
3
+ #define mul32x32_64(a,b) (((uint64_t)(a))*(b))
4
+
5
+ /* platform */
6
+ #if defined(COMPILER_MSVC)
7
+ #include <intrin.h>
8
+ #if !defined(_DEBUG)
9
+ #undef mul32x32_64
10
+ #define mul32x32_64(a,b) __emulu(a,b)
11
+ #endif
12
+ #undef inline
13
+ #define inline __forceinline
14
+ #define DONNA_INLINE __forceinline
15
+ #define DONNA_NOINLINE __declspec(noinline)
16
+ #define ALIGN(x) __declspec(align(x))
17
+ #define ROTL32(a,b) _rotl(a,b)
18
+ #define ROTR32(a,b) _rotr(a,b)
19
+ #else
20
+ #include <sys/param.h>
21
+ #define DONNA_INLINE inline __attribute__((always_inline))
22
+ #define DONNA_NOINLINE __attribute__((noinline))
23
+ #define ALIGN(x) __attribute__((aligned(x)))
24
+ #define ROTL32(a,b) (((a) << (b)) | ((a) >> (32 - b)))
25
+ #define ROTR32(a,b) (((a) >> (b)) | ((a) << (32 - b)))
26
+ #endif
27
+
28
+ /* uint128_t */
29
+ #if defined(CPU_64BITS) && !defined(ED25519_FORCE_32BIT)
30
+ #if defined(COMPILER_CLANG) && (COMPILER_CLANG >= 30100)
31
+ #define HAVE_NATIVE_UINT128
32
+ typedef unsigned __int128 uint128_t;
33
+ #elif defined(COMPILER_MSVC)
34
+ #define HAVE_UINT128
35
+ typedef struct uint128_t {
36
+ uint64_t lo, hi;
37
+ } uint128_t;
38
+ #define mul64x64_128(out,a,b) out.lo = _umul128(a,b,&out.hi);
39
+ #define shr128_pair(out,hi,lo,shift) out = __shiftright128(lo, hi, shift);
40
+ #define shl128_pair(out,hi,lo,shift) out = __shiftleft128(lo, hi, shift);
41
+ #define shr128(out,in,shift) shr128_pair(out, in.hi, in.lo, shift)
42
+ #define shl128(out,in,shift) shl128_pair(out, in.hi, in.lo, shift)
43
+ #define add128(a,b) { uint64_t p = a.lo; a.lo += b.lo; a.hi += b.hi + (a.lo < p); }
44
+ #define add128_64(a,b) { uint64_t p = a.lo; a.lo += b; a.hi += (a.lo < p); }
45
+ #define lo128(a) (a.lo)
46
+ #define hi128(a) (a.hi)
47
+ #elif defined(COMPILER_GCC) && !defined(HAVE_NATIVE_UINT128)
48
+ #if defined(__SIZEOF_INT128__)
49
+ #define HAVE_NATIVE_UINT128
50
+ typedef unsigned __int128 uint128_t;
51
+ #elif (COMPILER_GCC >= 40400)
52
+ #define HAVE_NATIVE_UINT128
53
+ typedef unsigned uint128_t __attribute__((mode(TI)));
54
+ #elif defined(CPU_X86_64)
55
+ #define HAVE_UINT128
56
+ typedef struct uint128_t {
57
+ uint64_t lo, hi;
58
+ } uint128_t;
59
+ #define mul64x64_128(out,a,b) __asm__ ("mulq %3" : "=a" (out.lo), "=d" (out.hi) : "a" (a), "rm" (b));
60
+ #define shr128_pair(out,hi,lo,shift) __asm__ ("shrdq %2,%1,%0" : "+r" (lo) : "r" (hi), "J" (shift)); out = lo;
61
+ #define shl128_pair(out,hi,lo,shift) __asm__ ("shldq %2,%1,%0" : "+r" (hi) : "r" (lo), "J" (shift)); out = hi;
62
+ #define shr128(out,in,shift) shr128_pair(out,in.hi, in.lo, shift)
63
+ #define shl128(out,in,shift) shl128_pair(out,in.hi, in.lo, shift)
64
+ #define add128(a,b) __asm__ ("addq %4,%2; adcq %5,%3" : "=r" (a.hi), "=r" (a.lo) : "1" (a.lo), "0" (a.hi), "rm" (b.lo), "rm" (b.hi) : "cc");
65
+ #define add128_64(a,b) __asm__ ("addq %4,%2; adcq $0,%3" : "=r" (a.hi), "=r" (a.lo) : "1" (a.lo), "0" (a.hi), "rm" (b) : "cc");
66
+ #define lo128(a) (a.lo)
67
+ #define hi128(a) (a.hi)
68
+ #endif
69
+ #endif
70
+
71
+ #if defined(HAVE_NATIVE_UINT128)
72
+ #define HAVE_UINT128
73
+ #define mul64x64_128(out,a,b) out = (uint128_t)a * b;
74
+ #define shr128_pair(out,hi,lo,shift) out = (uint64_t)((((uint128_t)hi << 64) | lo) >> (shift));
75
+ #define shl128_pair(out,hi,lo,shift) out = (uint64_t)(((((uint128_t)hi << 64) | lo) << (shift)) >> 64);
76
+ #define shr128(out,in,shift) out = (uint64_t)(in >> (shift));
77
+ #define shl128(out,in,shift) out = (uint64_t)((in << shift) >> 64);
78
+ #define add128(a,b) a += b;
79
+ #define add128_64(a,b) a += (uint64_t)b;
80
+ #define lo128(a) ((uint64_t)a)
81
+ #define hi128(a) ((uint64_t)(a >> 64))
82
+ #endif
83
+
84
+ #if !defined(HAVE_UINT128)
85
+ #error Need a uint128_t implementation!
86
+ #endif
87
+ #endif
88
+
89
+ /* endian */
90
+ #if !defined(ED25519_OPENSSLRNG)
91
+ static inline void U32TO8_LE(unsigned char *p, const uint32_t v) {
92
+ p[0] = (unsigned char)(v );
93
+ p[1] = (unsigned char)(v >> 8);
94
+ p[2] = (unsigned char)(v >> 16);
95
+ p[3] = (unsigned char)(v >> 24);
96
+ }
97
+ #endif
98
+
99
+ #if !defined(HAVE_UINT128)
100
+ static inline uint32_t U8TO32_LE(const unsigned char *p) {
101
+ return
102
+ (((uint32_t)(p[0]) ) |
103
+ ((uint32_t)(p[1]) << 8) |
104
+ ((uint32_t)(p[2]) << 16) |
105
+ ((uint32_t)(p[3]) << 24));
106
+ }
107
+ #else
108
+ static inline uint64_t U8TO64_LE(const unsigned char *p) {
109
+ return
110
+ (((uint64_t)(p[0]) ) |
111
+ ((uint64_t)(p[1]) << 8) |
112
+ ((uint64_t)(p[2]) << 16) |
113
+ ((uint64_t)(p[3]) << 24) |
114
+ ((uint64_t)(p[4]) << 32) |
115
+ ((uint64_t)(p[5]) << 40) |
116
+ ((uint64_t)(p[6]) << 48) |
117
+ ((uint64_t)(p[7]) << 56));
118
+ }
119
+
120
+ static inline void U64TO8_LE(unsigned char *p, const uint64_t v) {
121
+ p[0] = (unsigned char)(v );
122
+ p[1] = (unsigned char)(v >> 8);
123
+ p[2] = (unsigned char)(v >> 16);
124
+ p[3] = (unsigned char)(v >> 24);
125
+ p[4] = (unsigned char)(v >> 32);
126
+ p[5] = (unsigned char)(v >> 40);
127
+ p[6] = (unsigned char)(v >> 48);
128
+ p[7] = (unsigned char)(v >> 56);
129
+ }
130
+ #endif
131
+
132
+ #include <stdlib.h>
133
+ #include <string.h>
134
+
135
+
@@ -0,0 +1,115 @@
1
+ /*
2
+ Public domain by Andrew M. <liquidsun@gmail.com>
3
+ Modified from the amd64-51-30k implementation by
4
+ Daniel J. Bernstein
5
+ Niels Duif
6
+ Tanja Lange
7
+ Peter Schwabe
8
+ Bo-Yin Yang
9
+ */
10
+
11
+
12
+ #include "ed25519-donna-portable.h"
13
+
14
+ #if defined(ED25519_SSE2)
15
+ #else
16
+ #if defined(HAVE_UINT128) && !defined(ED25519_FORCE_32BIT)
17
+ #define ED25519_64BIT
18
+ #else
19
+ #define ED25519_32BIT
20
+ #endif
21
+ #endif
22
+
23
+ #if !defined(ED25519_NO_INLINE_ASM)
24
+ /* detect extra features first so un-needed functions can be disabled throughout */
25
+ #if defined(ED25519_SSE2)
26
+ #if defined(COMPILER_GCC) && defined(CPU_X86)
27
+ #define ED25519_GCC_32BIT_SSE_CHOOSE
28
+ #elif defined(COMPILER_GCC) && defined(CPU_X86_64)
29
+ #define ED25519_GCC_64BIT_SSE_CHOOSE
30
+ #endif
31
+ #else
32
+ #if defined(CPU_X86_64)
33
+ #if defined(COMPILER_GCC)
34
+ #if defined(ED25519_64BIT)
35
+ #define ED25519_GCC_64BIT_X86_CHOOSE
36
+ #else
37
+ #define ED25519_GCC_64BIT_32BIT_CHOOSE
38
+ #endif
39
+ #endif
40
+ #endif
41
+ #endif
42
+ #endif
43
+
44
+ #if defined(ED25519_SSE2)
45
+ #include "curve25519-donna-sse2.h"
46
+ #elif defined(ED25519_64BIT)
47
+ #include "curve25519-donna-64bit.h"
48
+ #else
49
+ #include "curve25519-donna-32bit.h"
50
+ #endif
51
+
52
+ #include "curve25519-donna-helpers.h"
53
+
54
+ /* separate uint128 check for 64 bit sse2 */
55
+ #if defined(HAVE_UINT128) && !defined(ED25519_FORCE_32BIT)
56
+ #include "modm-donna-64bit.h"
57
+ #else
58
+ #include "modm-donna-32bit.h"
59
+ #endif
60
+
61
+ typedef unsigned char hash_512bits[64];
62
+
63
+ /*
64
+ Timing safe memory compare
65
+ */
66
+ static int
67
+ ed25519_verify(const unsigned char *x, const unsigned char *y, size_t len) {
68
+ size_t differentbits = 0;
69
+ while (len--)
70
+ differentbits |= (*x++ ^ *y++);
71
+ return (int) (1 & ((differentbits - 1) >> 8));
72
+ }
73
+
74
+
75
+ /*
76
+ * Arithmetic on the twisted Edwards curve -x^2 + y^2 = 1 + dx^2y^2
77
+ * with d = -(121665/121666) = 37095705934669439343138083508754565189542113879843219016388785533085940283555
78
+ * Base point: (15112221349535400772501151409588531511454012693041857206046113283949847762202,46316835694926478169428394003475163141307993866256225615783033603165251855960);
79
+ */
80
+
81
+ typedef struct ge25519_t {
82
+ bignum25519 x, y, z, t;
83
+ } ge25519;
84
+
85
+ typedef struct ge25519_p1p1_t {
86
+ bignum25519 x, y, z, t;
87
+ } ge25519_p1p1;
88
+
89
+ typedef struct ge25519_niels_t {
90
+ bignum25519 ysubx, xaddy, t2d;
91
+ } ge25519_niels;
92
+
93
+ typedef struct ge25519_pniels_t {
94
+ bignum25519 ysubx, xaddy, z, t2d;
95
+ } ge25519_pniels;
96
+
97
+ #include "ed25519-donna-basepoint-table.h"
98
+
99
+ #if defined(ED25519_64BIT)
100
+ #include "ed25519-donna-64bit-tables.h"
101
+ #include "ed25519-donna-64bit-x86.h"
102
+ #else
103
+ #include "ed25519-donna-32bit-tables.h"
104
+ #include "ed25519-donna-64bit-x86-32bit.h"
105
+ #endif
106
+
107
+
108
+ #if defined(ED25519_SSE2)
109
+ #include "ed25519-donna-32bit-sse2.h"
110
+ #include "ed25519-donna-64bit-sse2.h"
111
+ #include "ed25519-donna-impl-sse2.h"
112
+ #else
113
+ #include "ed25519-donna-impl-base.h"
114
+ #endif
115
+
@@ -0,0 +1,28 @@
1
+ #include <stdlib.h>
2
+ #include "ed25519-hash-custom.h"
3
+ #include "blake2.h"
4
+
5
+ void ed25519_hash_init (ed25519_hash_context * ctx)
6
+ {
7
+ ctx->blake2 = (blake2b_state *) malloc(sizeof(blake2b_state));
8
+ blake2b_init(ctx->blake2, 64);
9
+ }
10
+
11
+ void ed25519_hash_update (ed25519_hash_context * ctx, uint8_t const * in, size_t inlen)
12
+ {
13
+ blake2b_update(ctx->blake2, in, inlen);
14
+ }
15
+
16
+ void ed25519_hash_final (ed25519_hash_context * ctx, uint8_t * out)
17
+ {
18
+ blake2b_final (ctx->blake2, out, 64);
19
+ free(ctx->blake2);
20
+ }
21
+
22
+ void ed25519_hash (uint8_t * out, uint8_t const * in, size_t inlen)
23
+ {
24
+ ed25519_hash_context ctx;
25
+ ed25519_hash_init (&ctx);
26
+ ed25519_hash_update (&ctx, in, inlen);
27
+ ed25519_hash_final (&ctx, out);
28
+ }
@@ -0,0 +1,30 @@
1
+ /*
2
+ a custom hash must have a 512bit digest and implement:
3
+
4
+ struct ed25519_hash_context;
5
+
6
+ void ed25519_hash_init(ed25519_hash_context *ctx);
7
+ void ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen);
8
+ void ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash);
9
+ void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen);
10
+ */
11
+
12
+ #include <stdint.h>
13
+ #include <stddef.h>
14
+
15
+ typedef struct {
16
+ uint8_t *output;
17
+ } Blake2;
18
+
19
+ typedef struct ed25519_hash_context_t
20
+ {
21
+ void *blake2;
22
+ } ed25519_hash_context;
23
+
24
+ void ed25519_hash_init (ed25519_hash_context * ctx);
25
+
26
+ void ed25519_hash_update (ed25519_hash_context * ctx, uint8_t const * in, size_t inlen);
27
+
28
+ void ed25519_hash_final (ed25519_hash_context * ctx, uint8_t * out);
29
+
30
+ void ed25519_hash (uint8_t * out, uint8_t const * in, size_t inlen);
@@ -0,0 +1,219 @@
1
+ #if defined(ED25519_REFHASH)
2
+
3
+ /* reference/slow SHA-512. really, do not use this */
4
+
5
+ #define HASH_BLOCK_SIZE 128
6
+ #define HASH_DIGEST_SIZE 64
7
+
8
+ typedef struct sha512_state_t {
9
+ uint64_t H[8];
10
+ uint64_t T[2];
11
+ uint32_t leftover;
12
+ uint8_t buffer[HASH_BLOCK_SIZE];
13
+ } sha512_state;
14
+
15
+ typedef sha512_state ed25519_hash_context;
16
+
17
+ static const uint64_t sha512_constants[80] = {
18
+ 0x428a2f98d728ae22ull, 0x7137449123ef65cdull, 0xb5c0fbcfec4d3b2full, 0xe9b5dba58189dbbcull,
19
+ 0x3956c25bf348b538ull, 0x59f111f1b605d019ull, 0x923f82a4af194f9bull, 0xab1c5ed5da6d8118ull,
20
+ 0xd807aa98a3030242ull, 0x12835b0145706fbeull, 0x243185be4ee4b28cull, 0x550c7dc3d5ffb4e2ull,
21
+ 0x72be5d74f27b896full, 0x80deb1fe3b1696b1ull, 0x9bdc06a725c71235ull, 0xc19bf174cf692694ull,
22
+ 0xe49b69c19ef14ad2ull, 0xefbe4786384f25e3ull, 0x0fc19dc68b8cd5b5ull, 0x240ca1cc77ac9c65ull,
23
+ 0x2de92c6f592b0275ull, 0x4a7484aa6ea6e483ull, 0x5cb0a9dcbd41fbd4ull, 0x76f988da831153b5ull,
24
+ 0x983e5152ee66dfabull, 0xa831c66d2db43210ull, 0xb00327c898fb213full, 0xbf597fc7beef0ee4ull,
25
+ 0xc6e00bf33da88fc2ull, 0xd5a79147930aa725ull, 0x06ca6351e003826full, 0x142929670a0e6e70ull,
26
+ 0x27b70a8546d22ffcull, 0x2e1b21385c26c926ull, 0x4d2c6dfc5ac42aedull, 0x53380d139d95b3dfull,
27
+ 0x650a73548baf63deull, 0x766a0abb3c77b2a8ull, 0x81c2c92e47edaee6ull, 0x92722c851482353bull,
28
+ 0xa2bfe8a14cf10364ull, 0xa81a664bbc423001ull, 0xc24b8b70d0f89791ull, 0xc76c51a30654be30ull,
29
+ 0xd192e819d6ef5218ull, 0xd69906245565a910ull, 0xf40e35855771202aull, 0x106aa07032bbd1b8ull,
30
+ 0x19a4c116b8d2d0c8ull, 0x1e376c085141ab53ull, 0x2748774cdf8eeb99ull, 0x34b0bcb5e19b48a8ull,
31
+ 0x391c0cb3c5c95a63ull, 0x4ed8aa4ae3418acbull, 0x5b9cca4f7763e373ull, 0x682e6ff3d6b2b8a3ull,
32
+ 0x748f82ee5defb2fcull, 0x78a5636f43172f60ull, 0x84c87814a1f0ab72ull, 0x8cc702081a6439ecull,
33
+ 0x90befffa23631e28ull, 0xa4506cebde82bde9ull, 0xbef9a3f7b2c67915ull, 0xc67178f2e372532bull,
34
+ 0xca273eceea26619cull, 0xd186b8c721c0c207ull, 0xeada7dd6cde0eb1eull, 0xf57d4f7fee6ed178ull,
35
+ 0x06f067aa72176fbaull, 0x0a637dc5a2c898a6ull, 0x113f9804bef90daeull, 0x1b710b35131c471bull,
36
+ 0x28db77f523047d84ull, 0x32caab7b40c72493ull, 0x3c9ebe0a15c9bebcull, 0x431d67c49c100d4cull,
37
+ 0x4cc5d4becb3e42b6ull, 0x597f299cfc657e2aull, 0x5fcb6fab3ad6faecull, 0x6c44198c4a475817ull
38
+ };
39
+
40
+ static uint64_t
41
+ sha512_ROTR64(uint64_t x, int k) {
42
+ return (x >> k) | (x << (64 - k));
43
+ }
44
+
45
+ static uint64_t
46
+ sha512_LOAD64_BE(const uint8_t *p) {
47
+ return
48
+ ((uint64_t)p[0] << 56) |
49
+ ((uint64_t)p[1] << 48) |
50
+ ((uint64_t)p[2] << 40) |
51
+ ((uint64_t)p[3] << 32) |
52
+ ((uint64_t)p[4] << 24) |
53
+ ((uint64_t)p[5] << 16) |
54
+ ((uint64_t)p[6] << 8) |
55
+ ((uint64_t)p[7] );
56
+ }
57
+
58
+ static void
59
+ sha512_STORE64_BE(uint8_t *p, uint64_t v) {
60
+ p[0] = (uint8_t)(v >> 56);
61
+ p[1] = (uint8_t)(v >> 48);
62
+ p[2] = (uint8_t)(v >> 40);
63
+ p[3] = (uint8_t)(v >> 32);
64
+ p[4] = (uint8_t)(v >> 24);
65
+ p[5] = (uint8_t)(v >> 16);
66
+ p[6] = (uint8_t)(v >> 8);
67
+ p[7] = (uint8_t)(v );
68
+ }
69
+
70
+ #define Ch(x,y,z) (z ^ (x & (y ^ z)))
71
+ #define Maj(x,y,z) (((x | y) & z) | (x & y))
72
+ #define S0(x) (sha512_ROTR64(x, 28) ^ sha512_ROTR64(x, 34) ^ sha512_ROTR64(x, 39))
73
+ #define S1(x) (sha512_ROTR64(x, 14) ^ sha512_ROTR64(x, 18) ^ sha512_ROTR64(x, 41))
74
+ #define G0(x) (sha512_ROTR64(x, 1) ^ sha512_ROTR64(x, 8) ^ (x >> 7))
75
+ #define G1(x) (sha512_ROTR64(x, 19) ^ sha512_ROTR64(x, 61) ^ (x >> 6))
76
+ #define W0(in,i) (sha512_LOAD64_BE(&in[i * 8]))
77
+ #define W1(i) (G1(w[i - 2]) + w[i - 7] + G0(w[i - 15]) + w[i - 16])
78
+ #define STEP(i) \
79
+ t1 = S0(r[0]) + Maj(r[0], r[1], r[2]); \
80
+ t0 = r[7] + S1(r[4]) + Ch(r[4], r[5], r[6]) + sha512_constants[i] + w[i]; \
81
+ r[7] = r[6]; \
82
+ r[6] = r[5]; \
83
+ r[5] = r[4]; \
84
+ r[4] = r[3] + t0; \
85
+ r[3] = r[2]; \
86
+ r[2] = r[1]; \
87
+ r[1] = r[0]; \
88
+ r[0] = t0 + t1;
89
+
90
+ static void
91
+ sha512_blocks(sha512_state *S, const uint8_t *in, size_t blocks) {
92
+ uint64_t r[8], w[80], t0, t1;
93
+ size_t i;
94
+
95
+ for (i = 0; i < 8; i++) r[i] = S->H[i];
96
+
97
+ while (blocks--) {
98
+ for (i = 0; i < 16; i++) { w[i] = W0(in, i); }
99
+ for (i = 16; i < 80; i++) { w[i] = W1(i); }
100
+ for (i = 0; i < 80; i++) { STEP(i); }
101
+ for (i = 0; i < 8; i++) { r[i] += S->H[i]; S->H[i] = r[i]; }
102
+ S->T[0] += HASH_BLOCK_SIZE * 8;
103
+ S->T[1] += (!S->T[0]) ? 1 : 0;
104
+ in += HASH_BLOCK_SIZE;
105
+ }
106
+ }
107
+
108
+ static void
109
+ ed25519_hash_init(sha512_state *S) {
110
+ S->H[0] = 0x6a09e667f3bcc908ull;
111
+ S->H[1] = 0xbb67ae8584caa73bull;
112
+ S->H[2] = 0x3c6ef372fe94f82bull;
113
+ S->H[3] = 0xa54ff53a5f1d36f1ull;
114
+ S->H[4] = 0x510e527fade682d1ull;
115
+ S->H[5] = 0x9b05688c2b3e6c1full;
116
+ S->H[6] = 0x1f83d9abfb41bd6bull;
117
+ S->H[7] = 0x5be0cd19137e2179ull;
118
+ S->T[0] = 0;
119
+ S->T[1] = 0;
120
+ S->leftover = 0;
121
+ }
122
+
123
+ static void
124
+ ed25519_hash_update(sha512_state *S, const uint8_t *in, size_t inlen) {
125
+ size_t blocks, want;
126
+
127
+ /* handle the previous data */
128
+ if (S->leftover) {
129
+ want = (HASH_BLOCK_SIZE - S->leftover);
130
+ want = (want < inlen) ? want : inlen;
131
+ memcpy(S->buffer + S->leftover, in, want);
132
+ S->leftover += (uint32_t)want;
133
+ if (S->leftover < HASH_BLOCK_SIZE)
134
+ return;
135
+ in += want;
136
+ inlen -= want;
137
+ sha512_blocks(S, S->buffer, 1);
138
+ }
139
+
140
+ /* handle the current data */
141
+ blocks = (inlen & ~(HASH_BLOCK_SIZE - 1));
142
+ S->leftover = (uint32_t)(inlen - blocks);
143
+ if (blocks) {
144
+ sha512_blocks(S, in, blocks / HASH_BLOCK_SIZE);
145
+ in += blocks;
146
+ }
147
+
148
+ /* handle leftover data */
149
+ if (S->leftover)
150
+ memcpy(S->buffer, in, S->leftover);
151
+ }
152
+
153
+ static void
154
+ ed25519_hash_final(sha512_state *S, uint8_t *hash) {
155
+ uint64_t t0 = S->T[0] + (S->leftover * 8), t1 = S->T[1];
156
+
157
+ S->buffer[S->leftover] = 0x80;
158
+ if (S->leftover <= 111) {
159
+ memset(S->buffer + S->leftover + 1, 0, 111 - S->leftover);
160
+ } else {
161
+ memset(S->buffer + S->leftover + 1, 0, 127 - S->leftover);
162
+ sha512_blocks(S, S->buffer, 1);
163
+ memset(S->buffer, 0, 112);
164
+ }
165
+
166
+ sha512_STORE64_BE(S->buffer + 112, t1);
167
+ sha512_STORE64_BE(S->buffer + 120, t0);
168
+ sha512_blocks(S, S->buffer, 1);
169
+
170
+ sha512_STORE64_BE(&hash[ 0], S->H[0]);
171
+ sha512_STORE64_BE(&hash[ 8], S->H[1]);
172
+ sha512_STORE64_BE(&hash[16], S->H[2]);
173
+ sha512_STORE64_BE(&hash[24], S->H[3]);
174
+ sha512_STORE64_BE(&hash[32], S->H[4]);
175
+ sha512_STORE64_BE(&hash[40], S->H[5]);
176
+ sha512_STORE64_BE(&hash[48], S->H[6]);
177
+ sha512_STORE64_BE(&hash[56], S->H[7]);
178
+ }
179
+
180
+ static void
181
+ ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen) {
182
+ ed25519_hash_context ctx;
183
+ ed25519_hash_init(&ctx);
184
+ ed25519_hash_update(&ctx, in, inlen);
185
+ ed25519_hash_final(&ctx, hash);
186
+ }
187
+
188
+ #elif defined(ED25519_CUSTOMHASH)
189
+
190
+ #include "ed25519-hash-custom.h"
191
+
192
+ #else
193
+
194
+ #include <openssl/sha.h>
195
+
196
+ typedef SHA512_CTX ed25519_hash_context;
197
+
198
+ static void
199
+ ed25519_hash_init(ed25519_hash_context *ctx) {
200
+ SHA512_Init(ctx);
201
+ }
202
+
203
+ static void
204
+ ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen) {
205
+ SHA512_Update(ctx, in, inlen);
206
+ }
207
+
208
+ static void
209
+ ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash) {
210
+ SHA512_Final(hash, ctx);
211
+ }
212
+
213
+ static void
214
+ ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen) {
215
+ SHA512(in, inlen, hash);
216
+ }
217
+
218
+ #endif
219
+