ed25519 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +5 -0
- data/.rubocop.yml +35 -0
- data/.travis.yml +13 -0
- data/CHANGES.md +3 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +12 -0
- data/LICENSE +22 -0
- data/README.md +156 -0
- data/Rakefile +27 -0
- data/ed25519.gemspec +32 -0
- data/ed25519.png +0 -0
- data/ext/ed25519/api.h +4 -0
- data/ext/ed25519/crypto_int32.h +6 -0
- data/ext/ed25519/crypto_sign.h +13 -0
- data/ext/ed25519/crypto_uint32.h +6 -0
- data/ext/ed25519/crypto_verify_32.h +7 -0
- data/ext/ed25519/ed25519.c +136 -0
- data/ext/ed25519/ed25519_engine.c +82 -0
- data/ext/ed25519/extconf.rb +6 -0
- data/ext/ed25519/fe25519.c +326 -0
- data/ext/ed25519/fe25519.h +63 -0
- data/ext/ed25519/ge25519.c +311 -0
- data/ext/ed25519/ge25519.h +35 -0
- data/ext/ed25519/ge25519_base.data +850 -0
- data/ext/ed25519/org/cryptosphere/ed25519.java +228 -0
- data/ext/ed25519/sc25519.c +298 -0
- data/ext/ed25519/sc25519.h +73 -0
- data/ext/ed25519/sha512-blocks.c +239 -0
- data/ext/ed25519/sha512-hash.c +72 -0
- data/ext/ed25519/sha512.h +4 -0
- data/ext/ed25519/verify.c +40 -0
- data/lib/ed25519.rb +34 -0
- data/lib/ed25519/jruby_engine.rb +30 -0
- data/lib/ed25519/signing_key.rb +35 -0
- data/lib/ed25519/verify_key.rb +28 -0
- data/lib/ed25519/version.rb +5 -0
- data/tasks/extension.rake +14 -0
- data/tasks/rspec.rake +9 -0
- metadata +98 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
#ifndef SC25519_H
|
2
|
+
#define SC25519_H
|
3
|
+
|
4
|
+
#include "crypto_int32.h"
|
5
|
+
#include "crypto_uint32.h"
|
6
|
+
|
7
|
+
#define sc25519 crypto_sign_ed25519_ref_sc25519
|
8
|
+
#define shortsc25519 crypto_sign_ed25519_ref_shortsc25519
|
9
|
+
#define sc25519_from32bytes crypto_sign_ed25519_ref_sc25519_from32bytes
|
10
|
+
#define shortsc25519_from16bytes crypto_sign_ed25519_ref_shortsc25519_from16bytes
|
11
|
+
#define sc25519_from64bytes crypto_sign_ed25519_ref_sc25519_from64bytes
|
12
|
+
#define sc25519_from_shortsc crypto_sign_ed25519_ref_sc25519_from_shortsc
|
13
|
+
#define sc25519_to32bytes crypto_sign_ed25519_ref_sc25519_to32bytes
|
14
|
+
#define sc25519_iszero_vartime crypto_sign_ed25519_ref_sc25519_iszero_vartime
|
15
|
+
#define sc25519_isshort_vartime crypto_sign_ed25519_ref_sc25519_isshort_vartime
|
16
|
+
#define sc25519_lt_vartime crypto_sign_ed25519_ref_sc25519_lt_vartime
|
17
|
+
#define sc25519_add crypto_sign_ed25519_ref_sc25519_add
|
18
|
+
#define sc25519_sub_nored crypto_sign_ed25519_ref_sc25519_sub_nored
|
19
|
+
#define sc25519_mul crypto_sign_ed25519_ref_sc25519_mul
|
20
|
+
#define sc25519_mul_shortsc crypto_sign_ed25519_ref_sc25519_mul_shortsc
|
21
|
+
#define sc25519_window3 crypto_sign_ed25519_ref_sc25519_window3
|
22
|
+
#define sc25519_window5 crypto_sign_ed25519_ref_sc25519_window5
|
23
|
+
#define sc25519_2interleave2 crypto_sign_ed25519_ref_sc25519_2interleave2
|
24
|
+
|
25
|
+
typedef struct
|
26
|
+
{
|
27
|
+
crypto_uint32 v[32];
|
28
|
+
}
|
29
|
+
sc25519;
|
30
|
+
|
31
|
+
typedef struct
|
32
|
+
{
|
33
|
+
crypto_uint32 v[16];
|
34
|
+
}
|
35
|
+
shortsc25519;
|
36
|
+
|
37
|
+
void sc25519_from32bytes(sc25519 *r, const unsigned char x[32]);
|
38
|
+
|
39
|
+
void shortsc25519_from16bytes(shortsc25519 *r, const unsigned char x[16]);
|
40
|
+
|
41
|
+
void sc25519_from64bytes(sc25519 *r, const unsigned char x[64]);
|
42
|
+
|
43
|
+
void sc25519_from_shortsc(sc25519 *r, const shortsc25519 *x);
|
44
|
+
|
45
|
+
void sc25519_to32bytes(unsigned char r[32], const sc25519 *x);
|
46
|
+
|
47
|
+
int sc25519_iszero_vartime(const sc25519 *x);
|
48
|
+
|
49
|
+
int sc25519_isshort_vartime(const sc25519 *x);
|
50
|
+
|
51
|
+
int sc25519_lt_vartime(const sc25519 *x, const sc25519 *y);
|
52
|
+
|
53
|
+
void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y);
|
54
|
+
|
55
|
+
void sc25519_sub_nored(sc25519 *r, const sc25519 *x, const sc25519 *y);
|
56
|
+
|
57
|
+
void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y);
|
58
|
+
|
59
|
+
void sc25519_mul_shortsc(sc25519 *r, const sc25519 *x, const shortsc25519 *y);
|
60
|
+
|
61
|
+
/* Convert s into a representation of the form \sum_{i=0}^{84}r[i]2^3
|
62
|
+
* with r[i] in {-4,...,3}
|
63
|
+
*/
|
64
|
+
void sc25519_window3(signed char r[85], const sc25519 *s);
|
65
|
+
|
66
|
+
/* Convert s into a representation of the form \sum_{i=0}^{50}r[i]2^5
|
67
|
+
* with r[i] in {-16,...,15}
|
68
|
+
*/
|
69
|
+
void sc25519_window5(signed char r[51], const sc25519 *s);
|
70
|
+
|
71
|
+
void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, const sc25519 *s2);
|
72
|
+
|
73
|
+
#endif
|
@@ -0,0 +1,239 @@
|
|
1
|
+
//#include "crypto_hashblocks.h"
|
2
|
+
|
3
|
+
typedef unsigned long long uint64;
|
4
|
+
|
5
|
+
static uint64 load_bigendian(const unsigned char *x)
|
6
|
+
{
|
7
|
+
return
|
8
|
+
(uint64) (x[7]) \
|
9
|
+
| (((uint64) (x[6])) << 8) \
|
10
|
+
| (((uint64) (x[5])) << 16) \
|
11
|
+
| (((uint64) (x[4])) << 24) \
|
12
|
+
| (((uint64) (x[3])) << 32) \
|
13
|
+
| (((uint64) (x[2])) << 40) \
|
14
|
+
| (((uint64) (x[1])) << 48) \
|
15
|
+
| (((uint64) (x[0])) << 56)
|
16
|
+
;
|
17
|
+
}
|
18
|
+
|
19
|
+
static void store_bigendian(unsigned char *x,uint64 u)
|
20
|
+
{
|
21
|
+
x[7] = u; u >>= 8;
|
22
|
+
x[6] = u; u >>= 8;
|
23
|
+
x[5] = u; u >>= 8;
|
24
|
+
x[4] = u; u >>= 8;
|
25
|
+
x[3] = u; u >>= 8;
|
26
|
+
x[2] = u; u >>= 8;
|
27
|
+
x[1] = u; u >>= 8;
|
28
|
+
x[0] = u;
|
29
|
+
}
|
30
|
+
|
31
|
+
#define SHR(x,c) ((x) >> (c))
|
32
|
+
#define ROTR(x,c) (((x) >> (c)) | ((x) << (64 - (c))))
|
33
|
+
|
34
|
+
#define Ch(x,y,z) ((x & y) ^ (~x & z))
|
35
|
+
#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
|
36
|
+
#define Sigma0(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
|
37
|
+
#define Sigma1(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
|
38
|
+
#define sigma0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x,7))
|
39
|
+
#define sigma1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x,6))
|
40
|
+
|
41
|
+
#define M(w0,w14,w9,w1) w0 = sigma1(w14) + w9 + sigma0(w1) + w0;
|
42
|
+
|
43
|
+
#define EXPAND \
|
44
|
+
M(w0 ,w14,w9 ,w1 ) \
|
45
|
+
M(w1 ,w15,w10,w2 ) \
|
46
|
+
M(w2 ,w0 ,w11,w3 ) \
|
47
|
+
M(w3 ,w1 ,w12,w4 ) \
|
48
|
+
M(w4 ,w2 ,w13,w5 ) \
|
49
|
+
M(w5 ,w3 ,w14,w6 ) \
|
50
|
+
M(w6 ,w4 ,w15,w7 ) \
|
51
|
+
M(w7 ,w5 ,w0 ,w8 ) \
|
52
|
+
M(w8 ,w6 ,w1 ,w9 ) \
|
53
|
+
M(w9 ,w7 ,w2 ,w10) \
|
54
|
+
M(w10,w8 ,w3 ,w11) \
|
55
|
+
M(w11,w9 ,w4 ,w12) \
|
56
|
+
M(w12,w10,w5 ,w13) \
|
57
|
+
M(w13,w11,w6 ,w14) \
|
58
|
+
M(w14,w12,w7 ,w15) \
|
59
|
+
M(w15,w13,w8 ,w0 )
|
60
|
+
|
61
|
+
#define F(w,k) \
|
62
|
+
T1 = h + Sigma1(e) + Ch(e,f,g) + k + w; \
|
63
|
+
T2 = Sigma0(a) + Maj(a,b,c); \
|
64
|
+
h = g; \
|
65
|
+
g = f; \
|
66
|
+
f = e; \
|
67
|
+
e = d + T1; \
|
68
|
+
d = c; \
|
69
|
+
c = b; \
|
70
|
+
b = a; \
|
71
|
+
a = T1 + T2;
|
72
|
+
|
73
|
+
int crypto_hashblocks(unsigned char *statebytes,const unsigned char *in,unsigned long long inlen)
|
74
|
+
{
|
75
|
+
uint64 state[8];
|
76
|
+
uint64 a;
|
77
|
+
uint64 b;
|
78
|
+
uint64 c;
|
79
|
+
uint64 d;
|
80
|
+
uint64 e;
|
81
|
+
uint64 f;
|
82
|
+
uint64 g;
|
83
|
+
uint64 h;
|
84
|
+
uint64 T1;
|
85
|
+
uint64 T2;
|
86
|
+
|
87
|
+
a = load_bigendian(statebytes + 0); state[0] = a;
|
88
|
+
b = load_bigendian(statebytes + 8); state[1] = b;
|
89
|
+
c = load_bigendian(statebytes + 16); state[2] = c;
|
90
|
+
d = load_bigendian(statebytes + 24); state[3] = d;
|
91
|
+
e = load_bigendian(statebytes + 32); state[4] = e;
|
92
|
+
f = load_bigendian(statebytes + 40); state[5] = f;
|
93
|
+
g = load_bigendian(statebytes + 48); state[6] = g;
|
94
|
+
h = load_bigendian(statebytes + 56); state[7] = h;
|
95
|
+
|
96
|
+
while (inlen >= 128) {
|
97
|
+
uint64 w0 = load_bigendian(in + 0);
|
98
|
+
uint64 w1 = load_bigendian(in + 8);
|
99
|
+
uint64 w2 = load_bigendian(in + 16);
|
100
|
+
uint64 w3 = load_bigendian(in + 24);
|
101
|
+
uint64 w4 = load_bigendian(in + 32);
|
102
|
+
uint64 w5 = load_bigendian(in + 40);
|
103
|
+
uint64 w6 = load_bigendian(in + 48);
|
104
|
+
uint64 w7 = load_bigendian(in + 56);
|
105
|
+
uint64 w8 = load_bigendian(in + 64);
|
106
|
+
uint64 w9 = load_bigendian(in + 72);
|
107
|
+
uint64 w10 = load_bigendian(in + 80);
|
108
|
+
uint64 w11 = load_bigendian(in + 88);
|
109
|
+
uint64 w12 = load_bigendian(in + 96);
|
110
|
+
uint64 w13 = load_bigendian(in + 104);
|
111
|
+
uint64 w14 = load_bigendian(in + 112);
|
112
|
+
uint64 w15 = load_bigendian(in + 120);
|
113
|
+
|
114
|
+
F(w0 ,0x428a2f98d728ae22ULL)
|
115
|
+
F(w1 ,0x7137449123ef65cdULL)
|
116
|
+
F(w2 ,0xb5c0fbcfec4d3b2fULL)
|
117
|
+
F(w3 ,0xe9b5dba58189dbbcULL)
|
118
|
+
F(w4 ,0x3956c25bf348b538ULL)
|
119
|
+
F(w5 ,0x59f111f1b605d019ULL)
|
120
|
+
F(w6 ,0x923f82a4af194f9bULL)
|
121
|
+
F(w7 ,0xab1c5ed5da6d8118ULL)
|
122
|
+
F(w8 ,0xd807aa98a3030242ULL)
|
123
|
+
F(w9 ,0x12835b0145706fbeULL)
|
124
|
+
F(w10,0x243185be4ee4b28cULL)
|
125
|
+
F(w11,0x550c7dc3d5ffb4e2ULL)
|
126
|
+
F(w12,0x72be5d74f27b896fULL)
|
127
|
+
F(w13,0x80deb1fe3b1696b1ULL)
|
128
|
+
F(w14,0x9bdc06a725c71235ULL)
|
129
|
+
F(w15,0xc19bf174cf692694ULL)
|
130
|
+
|
131
|
+
EXPAND
|
132
|
+
|
133
|
+
F(w0 ,0xe49b69c19ef14ad2ULL)
|
134
|
+
F(w1 ,0xefbe4786384f25e3ULL)
|
135
|
+
F(w2 ,0x0fc19dc68b8cd5b5ULL)
|
136
|
+
F(w3 ,0x240ca1cc77ac9c65ULL)
|
137
|
+
F(w4 ,0x2de92c6f592b0275ULL)
|
138
|
+
F(w5 ,0x4a7484aa6ea6e483ULL)
|
139
|
+
F(w6 ,0x5cb0a9dcbd41fbd4ULL)
|
140
|
+
F(w7 ,0x76f988da831153b5ULL)
|
141
|
+
F(w8 ,0x983e5152ee66dfabULL)
|
142
|
+
F(w9 ,0xa831c66d2db43210ULL)
|
143
|
+
F(w10,0xb00327c898fb213fULL)
|
144
|
+
F(w11,0xbf597fc7beef0ee4ULL)
|
145
|
+
F(w12,0xc6e00bf33da88fc2ULL)
|
146
|
+
F(w13,0xd5a79147930aa725ULL)
|
147
|
+
F(w14,0x06ca6351e003826fULL)
|
148
|
+
F(w15,0x142929670a0e6e70ULL)
|
149
|
+
|
150
|
+
EXPAND
|
151
|
+
|
152
|
+
F(w0 ,0x27b70a8546d22ffcULL)
|
153
|
+
F(w1 ,0x2e1b21385c26c926ULL)
|
154
|
+
F(w2 ,0x4d2c6dfc5ac42aedULL)
|
155
|
+
F(w3 ,0x53380d139d95b3dfULL)
|
156
|
+
F(w4 ,0x650a73548baf63deULL)
|
157
|
+
F(w5 ,0x766a0abb3c77b2a8ULL)
|
158
|
+
F(w6 ,0x81c2c92e47edaee6ULL)
|
159
|
+
F(w7 ,0x92722c851482353bULL)
|
160
|
+
F(w8 ,0xa2bfe8a14cf10364ULL)
|
161
|
+
F(w9 ,0xa81a664bbc423001ULL)
|
162
|
+
F(w10,0xc24b8b70d0f89791ULL)
|
163
|
+
F(w11,0xc76c51a30654be30ULL)
|
164
|
+
F(w12,0xd192e819d6ef5218ULL)
|
165
|
+
F(w13,0xd69906245565a910ULL)
|
166
|
+
F(w14,0xf40e35855771202aULL)
|
167
|
+
F(w15,0x106aa07032bbd1b8ULL)
|
168
|
+
|
169
|
+
EXPAND
|
170
|
+
|
171
|
+
F(w0 ,0x19a4c116b8d2d0c8ULL)
|
172
|
+
F(w1 ,0x1e376c085141ab53ULL)
|
173
|
+
F(w2 ,0x2748774cdf8eeb99ULL)
|
174
|
+
F(w3 ,0x34b0bcb5e19b48a8ULL)
|
175
|
+
F(w4 ,0x391c0cb3c5c95a63ULL)
|
176
|
+
F(w5 ,0x4ed8aa4ae3418acbULL)
|
177
|
+
F(w6 ,0x5b9cca4f7763e373ULL)
|
178
|
+
F(w7 ,0x682e6ff3d6b2b8a3ULL)
|
179
|
+
F(w8 ,0x748f82ee5defb2fcULL)
|
180
|
+
F(w9 ,0x78a5636f43172f60ULL)
|
181
|
+
F(w10,0x84c87814a1f0ab72ULL)
|
182
|
+
F(w11,0x8cc702081a6439ecULL)
|
183
|
+
F(w12,0x90befffa23631e28ULL)
|
184
|
+
F(w13,0xa4506cebde82bde9ULL)
|
185
|
+
F(w14,0xbef9a3f7b2c67915ULL)
|
186
|
+
F(w15,0xc67178f2e372532bULL)
|
187
|
+
|
188
|
+
EXPAND
|
189
|
+
|
190
|
+
F(w0 ,0xca273eceea26619cULL)
|
191
|
+
F(w1 ,0xd186b8c721c0c207ULL)
|
192
|
+
F(w2 ,0xeada7dd6cde0eb1eULL)
|
193
|
+
F(w3 ,0xf57d4f7fee6ed178ULL)
|
194
|
+
F(w4 ,0x06f067aa72176fbaULL)
|
195
|
+
F(w5 ,0x0a637dc5a2c898a6ULL)
|
196
|
+
F(w6 ,0x113f9804bef90daeULL)
|
197
|
+
F(w7 ,0x1b710b35131c471bULL)
|
198
|
+
F(w8 ,0x28db77f523047d84ULL)
|
199
|
+
F(w9 ,0x32caab7b40c72493ULL)
|
200
|
+
F(w10,0x3c9ebe0a15c9bebcULL)
|
201
|
+
F(w11,0x431d67c49c100d4cULL)
|
202
|
+
F(w12,0x4cc5d4becb3e42b6ULL)
|
203
|
+
F(w13,0x597f299cfc657e2aULL)
|
204
|
+
F(w14,0x5fcb6fab3ad6faecULL)
|
205
|
+
F(w15,0x6c44198c4a475817ULL)
|
206
|
+
|
207
|
+
a += state[0];
|
208
|
+
b += state[1];
|
209
|
+
c += state[2];
|
210
|
+
d += state[3];
|
211
|
+
e += state[4];
|
212
|
+
f += state[5];
|
213
|
+
g += state[6];
|
214
|
+
h += state[7];
|
215
|
+
|
216
|
+
state[0] = a;
|
217
|
+
state[1] = b;
|
218
|
+
state[2] = c;
|
219
|
+
state[3] = d;
|
220
|
+
state[4] = e;
|
221
|
+
state[5] = f;
|
222
|
+
state[6] = g;
|
223
|
+
state[7] = h;
|
224
|
+
|
225
|
+
in += 128;
|
226
|
+
inlen -= 128;
|
227
|
+
}
|
228
|
+
|
229
|
+
store_bigendian(statebytes + 0,state[0]);
|
230
|
+
store_bigendian(statebytes + 8,state[1]);
|
231
|
+
store_bigendian(statebytes + 16,state[2]);
|
232
|
+
store_bigendian(statebytes + 24,state[3]);
|
233
|
+
store_bigendian(statebytes + 32,state[4]);
|
234
|
+
store_bigendian(statebytes + 40,state[5]);
|
235
|
+
store_bigendian(statebytes + 48,state[6]);
|
236
|
+
store_bigendian(statebytes + 56,state[7]);
|
237
|
+
|
238
|
+
return inlen;
|
239
|
+
}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
/*
|
2
|
+
20080913
|
3
|
+
D. J. Bernstein
|
4
|
+
Public domain.
|
5
|
+
*/
|
6
|
+
|
7
|
+
#include "sha512.h"
|
8
|
+
|
9
|
+
extern int crypto_hashblocks(unsigned char *statebytes,const unsigned char *in,unsigned long long inlen);
|
10
|
+
|
11
|
+
#define blocks crypto_hashblocks
|
12
|
+
|
13
|
+
static const unsigned char iv[64] = {
|
14
|
+
0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08,
|
15
|
+
0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b,
|
16
|
+
0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b,
|
17
|
+
0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1,
|
18
|
+
0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1,
|
19
|
+
0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f,
|
20
|
+
0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b,
|
21
|
+
0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79
|
22
|
+
} ;
|
23
|
+
|
24
|
+
typedef unsigned long long uint64;
|
25
|
+
|
26
|
+
int crypto_hash_sha512(unsigned char *out,const unsigned char *in,unsigned long long inlen)
|
27
|
+
{
|
28
|
+
unsigned char h[64];
|
29
|
+
unsigned char padded[256];
|
30
|
+
int i;
|
31
|
+
unsigned long long bytes = inlen;
|
32
|
+
|
33
|
+
for (i = 0;i < 64;++i) h[i] = iv[i];
|
34
|
+
|
35
|
+
blocks(h,in,inlen);
|
36
|
+
in += inlen;
|
37
|
+
inlen &= 127;
|
38
|
+
in -= inlen;
|
39
|
+
|
40
|
+
for (i = 0;i < inlen;++i) padded[i] = in[i];
|
41
|
+
padded[inlen] = 0x80;
|
42
|
+
|
43
|
+
if (inlen < 112) {
|
44
|
+
for (i = inlen + 1;i < 119;++i) padded[i] = 0;
|
45
|
+
padded[119] = bytes >> 61;
|
46
|
+
padded[120] = bytes >> 53;
|
47
|
+
padded[121] = bytes >> 45;
|
48
|
+
padded[122] = bytes >> 37;
|
49
|
+
padded[123] = bytes >> 29;
|
50
|
+
padded[124] = bytes >> 21;
|
51
|
+
padded[125] = bytes >> 13;
|
52
|
+
padded[126] = bytes >> 5;
|
53
|
+
padded[127] = bytes << 3;
|
54
|
+
blocks(h,padded,128);
|
55
|
+
} else {
|
56
|
+
for (i = inlen + 1;i < 247;++i) padded[i] = 0;
|
57
|
+
padded[247] = bytes >> 61;
|
58
|
+
padded[248] = bytes >> 53;
|
59
|
+
padded[249] = bytes >> 45;
|
60
|
+
padded[250] = bytes >> 37;
|
61
|
+
padded[251] = bytes >> 29;
|
62
|
+
padded[252] = bytes >> 21;
|
63
|
+
padded[253] = bytes >> 13;
|
64
|
+
padded[254] = bytes >> 5;
|
65
|
+
padded[255] = bytes << 3;
|
66
|
+
blocks(h,padded,256);
|
67
|
+
}
|
68
|
+
|
69
|
+
for (i = 0;i < 64;++i) out[i] = h[i];
|
70
|
+
|
71
|
+
return 0;
|
72
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#include "crypto_verify_32.h"
|
2
|
+
|
3
|
+
int crypto_verify_32(const unsigned char *x,const unsigned char *y)
|
4
|
+
{
|
5
|
+
unsigned int differentbits = 0;
|
6
|
+
#define F(i) differentbits |= x[i] ^ y[i];
|
7
|
+
F(0)
|
8
|
+
F(1)
|
9
|
+
F(2)
|
10
|
+
F(3)
|
11
|
+
F(4)
|
12
|
+
F(5)
|
13
|
+
F(6)
|
14
|
+
F(7)
|
15
|
+
F(8)
|
16
|
+
F(9)
|
17
|
+
F(10)
|
18
|
+
F(11)
|
19
|
+
F(12)
|
20
|
+
F(13)
|
21
|
+
F(14)
|
22
|
+
F(15)
|
23
|
+
F(16)
|
24
|
+
F(17)
|
25
|
+
F(18)
|
26
|
+
F(19)
|
27
|
+
F(20)
|
28
|
+
F(21)
|
29
|
+
F(22)
|
30
|
+
F(23)
|
31
|
+
F(24)
|
32
|
+
F(25)
|
33
|
+
F(26)
|
34
|
+
F(27)
|
35
|
+
F(28)
|
36
|
+
F(29)
|
37
|
+
F(30)
|
38
|
+
F(31)
|
39
|
+
return (1 & ((differentbits - 1) >> 8)) - 1;
|
40
|
+
}
|
data/lib/ed25519.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "ed25519/version"
|
4
|
+
require "ed25519_engine"
|
5
|
+
require "ed25519/jruby_engine" if defined? JRUBY_VERSION
|
6
|
+
require "ed25519/signing_key"
|
7
|
+
require "ed25519/verify_key"
|
8
|
+
|
9
|
+
# The Ed25519 digital signatre algorithm
|
10
|
+
# rubocop:disable Metrics/LineLength
|
11
|
+
module Ed25519
|
12
|
+
SECRET_KEY_BYTES = 32
|
13
|
+
PUBLIC_KEY_BYTES = 32
|
14
|
+
SIGNATURE_BYTES = 64
|
15
|
+
|
16
|
+
class SelfTestFailure < StandardError; end
|
17
|
+
|
18
|
+
def self.test
|
19
|
+
signature_key = Ed25519::SigningKey.new("A" * 32)
|
20
|
+
raise SelfTestFailure, "failed to generate verify key correctly" unless signature_key.verify_key.to_bytes.unpack("H*").first == "db995fe25169d141cab9bbba92baa01f9f2e1ece7df4cb2ac05190f37fcc1f9d"
|
21
|
+
|
22
|
+
message = "crypto libraries should self-test on boot"
|
23
|
+
signature = signature_key.sign(message)
|
24
|
+
raise SelfTestFailure, "failed to generate correct signature" unless signature.unpack("H*").first == "c62c12a3a6cbfa04800d4be81468ef8aecd152a6a26a81d91257baecef13ba209531fe905a843e833c8b71cee04400fa2af3a29fef1152ece470421848758d0a"
|
25
|
+
|
26
|
+
verify_key = signature_key.verify_key
|
27
|
+
raise SelfTestFailure, "failed to verify a valid signature" unless verify_key.verify(signature, message)
|
28
|
+
|
29
|
+
bad_signature = signature[0...63] + "X"
|
30
|
+
raise SelfTestFailure, "failed to detect an invalid signature" unless verify_key.verify(bad_signature, message) == false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Ed25519.test
|