ed-precompiled_ed25519 1.4.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/CHANGES.md +88 -0
- data/LICENSE +22 -0
- data/README.md +181 -0
- data/ed25519.png +0 -0
- data/ext/ed25519_jruby/LICENSE.txt +123 -0
- data/ext/ed25519_jruby/README.md +77 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAEngine.java +491 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAKey.java +31 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAPrivateKey.java +338 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSAPublicKey.java +275 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/EdDSASecurityProvider.java +59 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/KeyFactory.java +75 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/KeyPairGenerator.java +97 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/Utils.java +103 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Constants.java +23 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Curve.java +100 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Encoding.java +54 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/Field.java +99 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/FieldElement.java +76 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/GroupElement.java +1034 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ScalarOps.java +34 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/BigIntegerFieldElement.java +131 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/BigIntegerLittleEndianEncoding.java +102 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/BigIntegerScalarOps.java +37 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/bigint/package.html +6 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement.java +988 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ed25519/Ed25519LittleEndianEncoding.java +256 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/math/ed25519/Ed25519ScalarOps.java +693 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAGenParameterSpec.java +32 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSANamedCurveSpec.java +35 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSANamedCurveTable.java +71 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAParameterSpec.java +97 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAPrivateKeySpec.java +133 -0
- data/ext/ed25519_jruby/net/i2p/crypto/eddsa/spec/EdDSAPublicKeySpec.java +61 -0
- data/ext/ed25519_jruby/org/cryptorb/Ed25519Provider.java +95 -0
- data/ext/ed25519_ref10/api.h +4 -0
- data/ext/ed25519_ref10/base.h +1344 -0
- data/ext/ed25519_ref10/base2.h +40 -0
- data/ext/ed25519_ref10/d.h +1 -0
- data/ext/ed25519_ref10/d2.h +1 -0
- data/ext/ed25519_ref10/ed25519_ref10.c +99 -0
- data/ext/ed25519_ref10/ed25519_ref10.h +33 -0
- data/ext/ed25519_ref10/extconf.rb +7 -0
- data/ext/ed25519_ref10/fe.c +1085 -0
- data/ext/ed25519_ref10/fe.h +56 -0
- data/ext/ed25519_ref10/ge.c +407 -0
- data/ext/ed25519_ref10/ge.h +95 -0
- data/ext/ed25519_ref10/ge_add.h +97 -0
- data/ext/ed25519_ref10/ge_madd.h +88 -0
- data/ext/ed25519_ref10/ge_msub.h +88 -0
- data/ext/ed25519_ref10/ge_p2_dbl.h +73 -0
- data/ext/ed25519_ref10/ge_sub.h +97 -0
- data/ext/ed25519_ref10/keypair.c +22 -0
- data/ext/ed25519_ref10/open.c +47 -0
- data/ext/ed25519_ref10/pow22523.h +160 -0
- data/ext/ed25519_ref10/pow225521.h +160 -0
- data/ext/ed25519_ref10/sc.h +17 -0
- data/ext/ed25519_ref10/sc_muladd.c +366 -0
- data/ext/ed25519_ref10/sc_reduce.c +272 -0
- data/ext/ed25519_ref10/sha512.c +304 -0
- data/ext/ed25519_ref10/sha512.h +8 -0
- data/ext/ed25519_ref10/sign.c +41 -0
- data/ext/ed25519_ref10/sqrtm1.h +1 -0
- data/ext/ed25519_ref10/verify.c +40 -0
- data/lib/ed25519/signing_key.rb +60 -0
- data/lib/ed25519/verify_key.rb +45 -0
- data/lib/ed25519/version.rb +5 -0
- data/lib/ed25519.rb +77 -0
- metadata +126 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#ifndef FE_H
|
|
2
|
+
#define FE_H
|
|
3
|
+
|
|
4
|
+
#include "ed25519_ref10.h"
|
|
5
|
+
|
|
6
|
+
typedef int32_t fe[10];
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
fe means field element.
|
|
10
|
+
Here the field is \Z/(2^255-19).
|
|
11
|
+
An element t, entries t[0]...t[9], represents the integer
|
|
12
|
+
t[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9].
|
|
13
|
+
Bounds on each t[i] vary depending on context.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
#define fe_frombytes crypto_sign_ed25519_ref10_fe_frombytes
|
|
17
|
+
#define fe_tobytes crypto_sign_ed25519_ref10_fe_tobytes
|
|
18
|
+
#define fe_copy crypto_sign_ed25519_ref10_fe_copy
|
|
19
|
+
#define fe_isnonzero crypto_sign_ed25519_ref10_fe_isnonzero
|
|
20
|
+
#define fe_isnegative crypto_sign_ed25519_ref10_fe_isnegative
|
|
21
|
+
#define fe_0 crypto_sign_ed25519_ref10_fe_0
|
|
22
|
+
#define fe_1 crypto_sign_ed25519_ref10_fe_1
|
|
23
|
+
#define fe_cswap crypto_sign_ed25519_ref10_fe_cswap
|
|
24
|
+
#define fe_cmov crypto_sign_ed25519_ref10_fe_cmov
|
|
25
|
+
#define fe_add crypto_sign_ed25519_ref10_fe_add
|
|
26
|
+
#define fe_sub crypto_sign_ed25519_ref10_fe_sub
|
|
27
|
+
#define fe_neg crypto_sign_ed25519_ref10_fe_neg
|
|
28
|
+
#define fe_mul crypto_sign_ed25519_ref10_fe_mul
|
|
29
|
+
#define fe_sq crypto_sign_ed25519_ref10_fe_sq
|
|
30
|
+
#define fe_sq2 crypto_sign_ed25519_ref10_fe_sq2
|
|
31
|
+
#define fe_mul121666 crypto_sign_ed25519_ref10_fe_mul121666
|
|
32
|
+
#define fe_invert crypto_sign_ed25519_ref10_fe_invert
|
|
33
|
+
#define fe_pow22523 crypto_sign_ed25519_ref10_fe_pow22523
|
|
34
|
+
|
|
35
|
+
extern void fe_frombytes(fe,const unsigned char *);
|
|
36
|
+
extern void fe_tobytes(unsigned char *,const fe);
|
|
37
|
+
|
|
38
|
+
extern void fe_copy(fe,const fe);
|
|
39
|
+
extern int fe_isnonzero(const fe);
|
|
40
|
+
extern int fe_isnegative(const fe);
|
|
41
|
+
extern void fe_0(fe);
|
|
42
|
+
extern void fe_1(fe);
|
|
43
|
+
extern void fe_cswap(fe,fe,unsigned int);
|
|
44
|
+
extern void fe_cmov(fe,const fe,unsigned int);
|
|
45
|
+
|
|
46
|
+
extern void fe_add(fe,const fe,const fe);
|
|
47
|
+
extern void fe_sub(fe,const fe,const fe);
|
|
48
|
+
extern void fe_neg(fe,const fe);
|
|
49
|
+
extern void fe_mul(fe,const fe,const fe);
|
|
50
|
+
extern void fe_sq(fe,const fe);
|
|
51
|
+
extern void fe_sq2(fe,const fe);
|
|
52
|
+
extern void fe_mul121666(fe,const fe);
|
|
53
|
+
extern void fe_invert(fe,const fe);
|
|
54
|
+
extern void fe_pow22523(fe,const fe);
|
|
55
|
+
|
|
56
|
+
#endif
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
#include "ge.h"
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
r = p + q
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
void ge_add(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q)
|
|
8
|
+
{
|
|
9
|
+
fe t0;
|
|
10
|
+
#include "ge_add.h"
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
static void slide(signed char *r,const unsigned char *a)
|
|
14
|
+
{
|
|
15
|
+
int i;
|
|
16
|
+
int b;
|
|
17
|
+
int k;
|
|
18
|
+
|
|
19
|
+
for (i = 0;i < 256;++i)
|
|
20
|
+
r[i] = 1 & (a[i >> 3] >> (i & 7));
|
|
21
|
+
|
|
22
|
+
for (i = 0;i < 256;++i)
|
|
23
|
+
if (r[i]) {
|
|
24
|
+
for (b = 1;b <= 6 && i + b < 256;++b) {
|
|
25
|
+
if (r[i + b]) {
|
|
26
|
+
if (r[i] + (r[i + b] << b) <= 15) {
|
|
27
|
+
r[i] += r[i + b] << b; r[i + b] = 0;
|
|
28
|
+
} else if (r[i] - (r[i + b] << b) >= -15) {
|
|
29
|
+
r[i] -= r[i + b] << b;
|
|
30
|
+
for (k = i + b;k < 256;++k) {
|
|
31
|
+
if (!r[k]) {
|
|
32
|
+
r[k] = 1;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
r[k] = 0;
|
|
36
|
+
}
|
|
37
|
+
} else
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static ge_precomp Bi[8] = {
|
|
46
|
+
#include "base2.h"
|
|
47
|
+
} ;
|
|
48
|
+
|
|
49
|
+
/*
|
|
50
|
+
r = a * A + b * B
|
|
51
|
+
where a = a[0]+256*a[1]+...+256^31 a[31].
|
|
52
|
+
and b = b[0]+256*b[1]+...+256^31 b[31].
|
|
53
|
+
B is the Ed25519 base point (x,4/5) with x positive.
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
void ge_double_scalarmult_vartime(ge_p2 *r,const unsigned char *a,const ge_p3 *A,const unsigned char *b)
|
|
57
|
+
{
|
|
58
|
+
signed char aslide[256];
|
|
59
|
+
signed char bslide[256];
|
|
60
|
+
ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */
|
|
61
|
+
ge_p1p1 t;
|
|
62
|
+
ge_p3 u;
|
|
63
|
+
ge_p3 A2;
|
|
64
|
+
int i;
|
|
65
|
+
|
|
66
|
+
slide(aslide,a);
|
|
67
|
+
slide(bslide,b);
|
|
68
|
+
|
|
69
|
+
ge_p3_to_cached(&Ai[0],A);
|
|
70
|
+
ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t);
|
|
71
|
+
ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u);
|
|
72
|
+
ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u);
|
|
73
|
+
ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u);
|
|
74
|
+
ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u);
|
|
75
|
+
ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u);
|
|
76
|
+
ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u);
|
|
77
|
+
ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u);
|
|
78
|
+
|
|
79
|
+
ge_p2_0(r);
|
|
80
|
+
|
|
81
|
+
for (i = 255;i >= 0;--i) {
|
|
82
|
+
if (aslide[i] || bslide[i]) break;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
for (;i >= 0;--i) {
|
|
86
|
+
ge_p2_dbl(&t,r);
|
|
87
|
+
|
|
88
|
+
if (aslide[i] > 0) {
|
|
89
|
+
ge_p1p1_to_p3(&u,&t);
|
|
90
|
+
ge_add(&t,&u,&Ai[aslide[i]/2]);
|
|
91
|
+
} else if (aslide[i] < 0) {
|
|
92
|
+
ge_p1p1_to_p3(&u,&t);
|
|
93
|
+
ge_sub(&t,&u,&Ai[(-aslide[i])/2]);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (bslide[i] > 0) {
|
|
97
|
+
ge_p1p1_to_p3(&u,&t);
|
|
98
|
+
ge_madd(&t,&u,&Bi[bslide[i]/2]);
|
|
99
|
+
} else if (bslide[i] < 0) {
|
|
100
|
+
ge_p1p1_to_p3(&u,&t);
|
|
101
|
+
ge_msub(&t,&u,&Bi[(-bslide[i])/2]);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
ge_p1p1_to_p2(r,&t);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
static const fe d = {
|
|
109
|
+
#include "d.h"
|
|
110
|
+
} ;
|
|
111
|
+
|
|
112
|
+
static const fe sqrtm1 = {
|
|
113
|
+
#include "sqrtm1.h"
|
|
114
|
+
} ;
|
|
115
|
+
|
|
116
|
+
int ge_frombytes_negate_vartime(ge_p3 *h,const unsigned char *s)
|
|
117
|
+
{
|
|
118
|
+
fe u;
|
|
119
|
+
fe v;
|
|
120
|
+
fe v3;
|
|
121
|
+
fe vxx;
|
|
122
|
+
fe check;
|
|
123
|
+
|
|
124
|
+
fe_frombytes(h->Y,s);
|
|
125
|
+
fe_1(h->Z);
|
|
126
|
+
fe_sq(u,h->Y);
|
|
127
|
+
fe_mul(v,u,d);
|
|
128
|
+
fe_sub(u,u,h->Z); /* u = y^2-1 */
|
|
129
|
+
fe_add(v,v,h->Z); /* v = dy^2+1 */
|
|
130
|
+
|
|
131
|
+
fe_sq(v3,v);
|
|
132
|
+
fe_mul(v3,v3,v); /* v3 = v^3 */
|
|
133
|
+
fe_sq(h->X,v3);
|
|
134
|
+
fe_mul(h->X,h->X,v);
|
|
135
|
+
fe_mul(h->X,h->X,u); /* x = uv^7 */
|
|
136
|
+
|
|
137
|
+
fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */
|
|
138
|
+
fe_mul(h->X,h->X,v3);
|
|
139
|
+
fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */
|
|
140
|
+
|
|
141
|
+
fe_sq(vxx,h->X);
|
|
142
|
+
fe_mul(vxx,vxx,v);
|
|
143
|
+
fe_sub(check,vxx,u); /* vx^2-u */
|
|
144
|
+
if (fe_isnonzero(check)) {
|
|
145
|
+
fe_add(check,vxx,u); /* vx^2+u */
|
|
146
|
+
if (fe_isnonzero(check)) return -1;
|
|
147
|
+
fe_mul(h->X,h->X,sqrtm1);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (fe_isnegative(h->X) == (s[31] >> 7))
|
|
151
|
+
fe_neg(h->X,h->X);
|
|
152
|
+
|
|
153
|
+
fe_mul(h->T,h->X,h->Y);
|
|
154
|
+
return 0;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/*
|
|
158
|
+
r = p + q
|
|
159
|
+
*/
|
|
160
|
+
|
|
161
|
+
void ge_madd(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q)
|
|
162
|
+
{
|
|
163
|
+
fe t0;
|
|
164
|
+
#include "ge_madd.h"
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/*
|
|
168
|
+
r = p - q
|
|
169
|
+
*/
|
|
170
|
+
|
|
171
|
+
void ge_msub(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q)
|
|
172
|
+
{
|
|
173
|
+
fe t0;
|
|
174
|
+
#include "ge_msub.h"
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/*
|
|
178
|
+
r = p
|
|
179
|
+
*/
|
|
180
|
+
|
|
181
|
+
extern void ge_p1p1_to_p2(ge_p2 *r,const ge_p1p1 *p)
|
|
182
|
+
{
|
|
183
|
+
fe_mul(r->X,p->X,p->T);
|
|
184
|
+
fe_mul(r->Y,p->Y,p->Z);
|
|
185
|
+
fe_mul(r->Z,p->Z,p->T);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/*
|
|
189
|
+
r = p
|
|
190
|
+
*/
|
|
191
|
+
|
|
192
|
+
extern void ge_p1p1_to_p3(ge_p3 *r,const ge_p1p1 *p)
|
|
193
|
+
{
|
|
194
|
+
fe_mul(r->X,p->X,p->T);
|
|
195
|
+
fe_mul(r->Y,p->Y,p->Z);
|
|
196
|
+
fe_mul(r->Z,p->Z,p->T);
|
|
197
|
+
fe_mul(r->T,p->X,p->Y);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
void ge_p2_0(ge_p2 *h)
|
|
201
|
+
{
|
|
202
|
+
fe_0(h->X);
|
|
203
|
+
fe_1(h->Y);
|
|
204
|
+
fe_1(h->Z);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/*
|
|
208
|
+
r = 2 * p
|
|
209
|
+
*/
|
|
210
|
+
|
|
211
|
+
void ge_p2_dbl(ge_p1p1 *r,const ge_p2 *p)
|
|
212
|
+
{
|
|
213
|
+
fe t0;
|
|
214
|
+
#include "ge_p2_dbl.h"
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
void ge_p3_0(ge_p3 *h)
|
|
218
|
+
{
|
|
219
|
+
fe_0(h->X);
|
|
220
|
+
fe_1(h->Y);
|
|
221
|
+
fe_1(h->Z);
|
|
222
|
+
fe_0(h->T);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/*
|
|
226
|
+
r = 2 * p
|
|
227
|
+
*/
|
|
228
|
+
|
|
229
|
+
void ge_p3_dbl(ge_p1p1 *r,const ge_p3 *p)
|
|
230
|
+
{
|
|
231
|
+
ge_p2 q;
|
|
232
|
+
ge_p3_to_p2(&q,p);
|
|
233
|
+
ge_p2_dbl(r,&q);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/*
|
|
237
|
+
r = p
|
|
238
|
+
*/
|
|
239
|
+
|
|
240
|
+
static const fe d2 = {
|
|
241
|
+
#include "d2.h"
|
|
242
|
+
} ;
|
|
243
|
+
|
|
244
|
+
extern void ge_p3_to_cached(ge_cached *r,const ge_p3 *p)
|
|
245
|
+
{
|
|
246
|
+
fe_add(r->YplusX,p->Y,p->X);
|
|
247
|
+
fe_sub(r->YminusX,p->Y,p->X);
|
|
248
|
+
fe_copy(r->Z,p->Z);
|
|
249
|
+
fe_mul(r->T2d,p->T,d2);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/*
|
|
253
|
+
r = p
|
|
254
|
+
*/
|
|
255
|
+
|
|
256
|
+
extern void ge_p3_to_p2(ge_p2 *r,const ge_p3 *p)
|
|
257
|
+
{
|
|
258
|
+
fe_copy(r->X,p->X);
|
|
259
|
+
fe_copy(r->Y,p->Y);
|
|
260
|
+
fe_copy(r->Z,p->Z);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
void ge_p3_tobytes(unsigned char *s,const ge_p3 *h)
|
|
264
|
+
{
|
|
265
|
+
fe recip;
|
|
266
|
+
fe x;
|
|
267
|
+
fe y;
|
|
268
|
+
|
|
269
|
+
fe_invert(recip,h->Z);
|
|
270
|
+
fe_mul(x,h->X,recip);
|
|
271
|
+
fe_mul(y,h->Y,recip);
|
|
272
|
+
fe_tobytes(s,y);
|
|
273
|
+
s[31] ^= fe_isnegative(x) << 7;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
void ge_precomp_0(ge_precomp *h)
|
|
277
|
+
{
|
|
278
|
+
fe_1(h->yplusx);
|
|
279
|
+
fe_1(h->yminusx);
|
|
280
|
+
fe_0(h->xy2d);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
static uint8_t equal(int8_t b,int8_t c)
|
|
284
|
+
{
|
|
285
|
+
uint8_t ub = b;
|
|
286
|
+
uint8_t uc = c;
|
|
287
|
+
uint8_t x = ub ^ uc; /* 0: yes; 1..255: no */
|
|
288
|
+
uint32_t y = x; /* 0: yes; 1..255: no */
|
|
289
|
+
y -= 1; /* 4294967295: yes; 0..254: no */
|
|
290
|
+
y >>= 31; /* 1: yes; 0: no */
|
|
291
|
+
return y;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
static uint8_t negative(int8_t b)
|
|
295
|
+
{
|
|
296
|
+
unsigned long long x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */
|
|
297
|
+
x >>= 63; /* 1: yes; 0: no */
|
|
298
|
+
return x;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
static void cmov(ge_precomp *t,ge_precomp *u,int8_t b)
|
|
302
|
+
{
|
|
303
|
+
fe_cmov(t->yplusx,u->yplusx,b);
|
|
304
|
+
fe_cmov(t->yminusx,u->yminusx,b);
|
|
305
|
+
fe_cmov(t->xy2d,u->xy2d,b);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/* base[i][j] = (j+1)*256^i*B */
|
|
309
|
+
static ge_precomp base[32][8] = {
|
|
310
|
+
#include "base.h"
|
|
311
|
+
} ;
|
|
312
|
+
|
|
313
|
+
static void select(ge_precomp *t,int pos,int8_t b)
|
|
314
|
+
{
|
|
315
|
+
ge_precomp minust;
|
|
316
|
+
uint8_t bnegative = negative(b);
|
|
317
|
+
uint8_t babs = b - (((-bnegative) & b) << 1);
|
|
318
|
+
|
|
319
|
+
ge_precomp_0(t);
|
|
320
|
+
cmov(t,&base[pos][0],equal(babs,1));
|
|
321
|
+
cmov(t,&base[pos][1],equal(babs,2));
|
|
322
|
+
cmov(t,&base[pos][2],equal(babs,3));
|
|
323
|
+
cmov(t,&base[pos][3],equal(babs,4));
|
|
324
|
+
cmov(t,&base[pos][4],equal(babs,5));
|
|
325
|
+
cmov(t,&base[pos][5],equal(babs,6));
|
|
326
|
+
cmov(t,&base[pos][6],equal(babs,7));
|
|
327
|
+
cmov(t,&base[pos][7],equal(babs,8));
|
|
328
|
+
fe_copy(minust.yplusx,t->yminusx);
|
|
329
|
+
fe_copy(minust.yminusx,t->yplusx);
|
|
330
|
+
fe_neg(minust.xy2d,t->xy2d);
|
|
331
|
+
cmov(t,&minust,bnegative);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/*
|
|
335
|
+
h = a * B
|
|
336
|
+
where a = a[0]+256*a[1]+...+256^31 a[31]
|
|
337
|
+
B is the Ed25519 base point (x,4/5) with x positive.
|
|
338
|
+
|
|
339
|
+
Preconditions:
|
|
340
|
+
a[31] <= 127
|
|
341
|
+
*/
|
|
342
|
+
|
|
343
|
+
void ge_scalarmult_base(ge_p3 *h,const uint8_t *a)
|
|
344
|
+
{
|
|
345
|
+
int8_t e[64];
|
|
346
|
+
int8_t carry;
|
|
347
|
+
ge_p1p1 r;
|
|
348
|
+
ge_p2 s;
|
|
349
|
+
ge_precomp t;
|
|
350
|
+
int i;
|
|
351
|
+
|
|
352
|
+
for (i = 0;i < 32;++i) {
|
|
353
|
+
e[2 * i + 0] = (a[i] >> 0) & 15;
|
|
354
|
+
e[2 * i + 1] = (a[i] >> 4) & 15;
|
|
355
|
+
}
|
|
356
|
+
/* each e[i] is between 0 and 15 */
|
|
357
|
+
/* e[63] is between 0 and 7 */
|
|
358
|
+
|
|
359
|
+
carry = 0;
|
|
360
|
+
for (i = 0;i < 63;++i) {
|
|
361
|
+
e[i] += carry;
|
|
362
|
+
carry = e[i] + 8;
|
|
363
|
+
carry >>= 4;
|
|
364
|
+
e[i] -= carry << 4;
|
|
365
|
+
}
|
|
366
|
+
e[63] += carry;
|
|
367
|
+
/* each e[i] is between -8 and 8 */
|
|
368
|
+
|
|
369
|
+
ge_p3_0(h);
|
|
370
|
+
for (i = 1;i < 64;i += 2) {
|
|
371
|
+
select(&t,i / 2,e[i]);
|
|
372
|
+
ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
ge_p3_dbl(&r,h); ge_p1p1_to_p2(&s,&r);
|
|
376
|
+
ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r);
|
|
377
|
+
ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r);
|
|
378
|
+
ge_p2_dbl(&r,&s); ge_p1p1_to_p3(h,&r);
|
|
379
|
+
|
|
380
|
+
for (i = 0;i < 64;i += 2) {
|
|
381
|
+
select(&t,i / 2,e[i]);
|
|
382
|
+
ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/*
|
|
387
|
+
r = p - q
|
|
388
|
+
*/
|
|
389
|
+
|
|
390
|
+
void ge_sub(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q)
|
|
391
|
+
{
|
|
392
|
+
fe t0;
|
|
393
|
+
#include "ge_sub.h"
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
void ge_tobytes(unsigned char *s,const ge_p2 *h)
|
|
397
|
+
{
|
|
398
|
+
fe recip;
|
|
399
|
+
fe x;
|
|
400
|
+
fe y;
|
|
401
|
+
|
|
402
|
+
fe_invert(recip,h->Z);
|
|
403
|
+
fe_mul(x,h->X,recip);
|
|
404
|
+
fe_mul(y,h->Y,recip);
|
|
405
|
+
fe_tobytes(s,y);
|
|
406
|
+
s[31] ^= fe_isnegative(x) << 7;
|
|
407
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#ifndef GE_H
|
|
2
|
+
#define GE_H
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
ge means group element.
|
|
6
|
+
|
|
7
|
+
Here the group is the set of pairs (x,y) of field elements (see fe.h)
|
|
8
|
+
satisfying -x^2 + y^2 = 1 + d x^2y^2
|
|
9
|
+
where d = -121665/121666.
|
|
10
|
+
|
|
11
|
+
Representations:
|
|
12
|
+
ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z
|
|
13
|
+
ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT
|
|
14
|
+
ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T
|
|
15
|
+
ge_precomp (Duif): (y+x,y-x,2dxy)
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#include "fe.h"
|
|
19
|
+
|
|
20
|
+
typedef struct {
|
|
21
|
+
fe X;
|
|
22
|
+
fe Y;
|
|
23
|
+
fe Z;
|
|
24
|
+
} ge_p2;
|
|
25
|
+
|
|
26
|
+
typedef struct {
|
|
27
|
+
fe X;
|
|
28
|
+
fe Y;
|
|
29
|
+
fe Z;
|
|
30
|
+
fe T;
|
|
31
|
+
} ge_p3;
|
|
32
|
+
|
|
33
|
+
typedef struct {
|
|
34
|
+
fe X;
|
|
35
|
+
fe Y;
|
|
36
|
+
fe Z;
|
|
37
|
+
fe T;
|
|
38
|
+
} ge_p1p1;
|
|
39
|
+
|
|
40
|
+
typedef struct {
|
|
41
|
+
fe yplusx;
|
|
42
|
+
fe yminusx;
|
|
43
|
+
fe xy2d;
|
|
44
|
+
} ge_precomp;
|
|
45
|
+
|
|
46
|
+
typedef struct {
|
|
47
|
+
fe YplusX;
|
|
48
|
+
fe YminusX;
|
|
49
|
+
fe Z;
|
|
50
|
+
fe T2d;
|
|
51
|
+
} ge_cached;
|
|
52
|
+
|
|
53
|
+
#define ge_frombytes_negate_vartime crypto_sign_ed25519_ref10_ge_frombytes_negate_vartime
|
|
54
|
+
#define ge_tobytes crypto_sign_ed25519_ref10_ge_tobytes
|
|
55
|
+
#define ge_p3_tobytes crypto_sign_ed25519_ref10_ge_p3_tobytes
|
|
56
|
+
|
|
57
|
+
#define ge_p2_0 crypto_sign_ed25519_ref10_ge_p2_0
|
|
58
|
+
#define ge_p3_0 crypto_sign_ed25519_ref10_ge_p3_0
|
|
59
|
+
#define ge_precomp_0 crypto_sign_ed25519_ref10_ge_precomp_0
|
|
60
|
+
#define ge_p3_to_p2 crypto_sign_ed25519_ref10_ge_p3_to_p2
|
|
61
|
+
#define ge_p3_to_cached crypto_sign_ed25519_ref10_ge_p3_to_cached
|
|
62
|
+
#define ge_p1p1_to_p2 crypto_sign_ed25519_ref10_ge_p1p1_to_p2
|
|
63
|
+
#define ge_p1p1_to_p3 crypto_sign_ed25519_ref10_ge_p1p1_to_p3
|
|
64
|
+
#define ge_p2_dbl crypto_sign_ed25519_ref10_ge_p2_dbl
|
|
65
|
+
#define ge_p3_dbl crypto_sign_ed25519_ref10_ge_p3_dbl
|
|
66
|
+
|
|
67
|
+
#define ge_madd crypto_sign_ed25519_ref10_ge_madd
|
|
68
|
+
#define ge_msub crypto_sign_ed25519_ref10_ge_msub
|
|
69
|
+
#define ge_add crypto_sign_ed25519_ref10_ge_add
|
|
70
|
+
#define ge_sub crypto_sign_ed25519_ref10_ge_sub
|
|
71
|
+
#define ge_scalarmult_base crypto_sign_ed25519_ref10_ge_scalarmult_base
|
|
72
|
+
#define ge_double_scalarmult_vartime crypto_sign_ed25519_ref10_ge_double_scalarmult_vartime
|
|
73
|
+
|
|
74
|
+
extern void ge_tobytes(unsigned char *,const ge_p2 *);
|
|
75
|
+
extern void ge_p3_tobytes(unsigned char *,const ge_p3 *);
|
|
76
|
+
extern int ge_frombytes_negate_vartime(ge_p3 *,const unsigned char *);
|
|
77
|
+
|
|
78
|
+
extern void ge_p2_0(ge_p2 *);
|
|
79
|
+
extern void ge_p3_0(ge_p3 *);
|
|
80
|
+
extern void ge_precomp_0(ge_precomp *);
|
|
81
|
+
extern void ge_p3_to_p2(ge_p2 *,const ge_p3 *);
|
|
82
|
+
extern void ge_p3_to_cached(ge_cached *,const ge_p3 *);
|
|
83
|
+
extern void ge_p1p1_to_p2(ge_p2 *,const ge_p1p1 *);
|
|
84
|
+
extern void ge_p1p1_to_p3(ge_p3 *,const ge_p1p1 *);
|
|
85
|
+
extern void ge_p2_dbl(ge_p1p1 *,const ge_p2 *);
|
|
86
|
+
extern void ge_p3_dbl(ge_p1p1 *,const ge_p3 *);
|
|
87
|
+
|
|
88
|
+
extern void ge_madd(ge_p1p1 *,const ge_p3 *,const ge_precomp *);
|
|
89
|
+
extern void ge_msub(ge_p1p1 *,const ge_p3 *,const ge_precomp *);
|
|
90
|
+
extern void ge_add(ge_p1p1 *,const ge_p3 *,const ge_cached *);
|
|
91
|
+
extern void ge_sub(ge_p1p1 *,const ge_p3 *,const ge_cached *);
|
|
92
|
+
extern void ge_scalarmult_base(ge_p3 *,const unsigned char *);
|
|
93
|
+
extern void ge_double_scalarmult_vartime(ge_p2 *,const unsigned char *,const ge_p3 *,const unsigned char *);
|
|
94
|
+
|
|
95
|
+
#endif
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
|
|
2
|
+
/* qhasm: enter ge_add */
|
|
3
|
+
|
|
4
|
+
/* qhasm: fe X1 */
|
|
5
|
+
|
|
6
|
+
/* qhasm: fe Y1 */
|
|
7
|
+
|
|
8
|
+
/* qhasm: fe Z1 */
|
|
9
|
+
|
|
10
|
+
/* qhasm: fe Z2 */
|
|
11
|
+
|
|
12
|
+
/* qhasm: fe T1 */
|
|
13
|
+
|
|
14
|
+
/* qhasm: fe ZZ */
|
|
15
|
+
|
|
16
|
+
/* qhasm: fe YpX2 */
|
|
17
|
+
|
|
18
|
+
/* qhasm: fe YmX2 */
|
|
19
|
+
|
|
20
|
+
/* qhasm: fe T2d2 */
|
|
21
|
+
|
|
22
|
+
/* qhasm: fe X3 */
|
|
23
|
+
|
|
24
|
+
/* qhasm: fe Y3 */
|
|
25
|
+
|
|
26
|
+
/* qhasm: fe Z3 */
|
|
27
|
+
|
|
28
|
+
/* qhasm: fe T3 */
|
|
29
|
+
|
|
30
|
+
/* qhasm: fe YpX1 */
|
|
31
|
+
|
|
32
|
+
/* qhasm: fe YmX1 */
|
|
33
|
+
|
|
34
|
+
/* qhasm: fe A */
|
|
35
|
+
|
|
36
|
+
/* qhasm: fe B */
|
|
37
|
+
|
|
38
|
+
/* qhasm: fe C */
|
|
39
|
+
|
|
40
|
+
/* qhasm: fe D */
|
|
41
|
+
|
|
42
|
+
/* qhasm: YpX1 = Y1+X1 */
|
|
43
|
+
/* asm 1: fe_add(>YpX1=fe#1,<Y1=fe#12,<X1=fe#11); */
|
|
44
|
+
/* asm 2: fe_add(>YpX1=r->X,<Y1=p->Y,<X1=p->X); */
|
|
45
|
+
fe_add(r->X,p->Y,p->X);
|
|
46
|
+
|
|
47
|
+
/* qhasm: YmX1 = Y1-X1 */
|
|
48
|
+
/* asm 1: fe_sub(>YmX1=fe#2,<Y1=fe#12,<X1=fe#11); */
|
|
49
|
+
/* asm 2: fe_sub(>YmX1=r->Y,<Y1=p->Y,<X1=p->X); */
|
|
50
|
+
fe_sub(r->Y,p->Y,p->X);
|
|
51
|
+
|
|
52
|
+
/* qhasm: A = YpX1*YpX2 */
|
|
53
|
+
/* asm 1: fe_mul(>A=fe#3,<YpX1=fe#1,<YpX2=fe#15); */
|
|
54
|
+
/* asm 2: fe_mul(>A=r->Z,<YpX1=r->X,<YpX2=q->YplusX); */
|
|
55
|
+
fe_mul(r->Z,r->X,q->YplusX);
|
|
56
|
+
|
|
57
|
+
/* qhasm: B = YmX1*YmX2 */
|
|
58
|
+
/* asm 1: fe_mul(>B=fe#2,<YmX1=fe#2,<YmX2=fe#16); */
|
|
59
|
+
/* asm 2: fe_mul(>B=r->Y,<YmX1=r->Y,<YmX2=q->YminusX); */
|
|
60
|
+
fe_mul(r->Y,r->Y,q->YminusX);
|
|
61
|
+
|
|
62
|
+
/* qhasm: C = T2d2*T1 */
|
|
63
|
+
/* asm 1: fe_mul(>C=fe#4,<T2d2=fe#18,<T1=fe#14); */
|
|
64
|
+
/* asm 2: fe_mul(>C=r->T,<T2d2=q->T2d,<T1=p->T); */
|
|
65
|
+
fe_mul(r->T,q->T2d,p->T);
|
|
66
|
+
|
|
67
|
+
/* qhasm: ZZ = Z1*Z2 */
|
|
68
|
+
/* asm 1: fe_mul(>ZZ=fe#1,<Z1=fe#13,<Z2=fe#17); */
|
|
69
|
+
/* asm 2: fe_mul(>ZZ=r->X,<Z1=p->Z,<Z2=q->Z); */
|
|
70
|
+
fe_mul(r->X,p->Z,q->Z);
|
|
71
|
+
|
|
72
|
+
/* qhasm: D = 2*ZZ */
|
|
73
|
+
/* asm 1: fe_add(>D=fe#5,<ZZ=fe#1,<ZZ=fe#1); */
|
|
74
|
+
/* asm 2: fe_add(>D=t0,<ZZ=r->X,<ZZ=r->X); */
|
|
75
|
+
fe_add(t0,r->X,r->X);
|
|
76
|
+
|
|
77
|
+
/* qhasm: X3 = A-B */
|
|
78
|
+
/* asm 1: fe_sub(>X3=fe#1,<A=fe#3,<B=fe#2); */
|
|
79
|
+
/* asm 2: fe_sub(>X3=r->X,<A=r->Z,<B=r->Y); */
|
|
80
|
+
fe_sub(r->X,r->Z,r->Y);
|
|
81
|
+
|
|
82
|
+
/* qhasm: Y3 = A+B */
|
|
83
|
+
/* asm 1: fe_add(>Y3=fe#2,<A=fe#3,<B=fe#2); */
|
|
84
|
+
/* asm 2: fe_add(>Y3=r->Y,<A=r->Z,<B=r->Y); */
|
|
85
|
+
fe_add(r->Y,r->Z,r->Y);
|
|
86
|
+
|
|
87
|
+
/* qhasm: Z3 = D+C */
|
|
88
|
+
/* asm 1: fe_add(>Z3=fe#3,<D=fe#5,<C=fe#4); */
|
|
89
|
+
/* asm 2: fe_add(>Z3=r->Z,<D=t0,<C=r->T); */
|
|
90
|
+
fe_add(r->Z,t0,r->T);
|
|
91
|
+
|
|
92
|
+
/* qhasm: T3 = D-C */
|
|
93
|
+
/* asm 1: fe_sub(>T3=fe#4,<D=fe#5,<C=fe#4); */
|
|
94
|
+
/* asm 2: fe_sub(>T3=r->T,<D=t0,<C=r->T); */
|
|
95
|
+
fe_sub(r->T,t0,r->T);
|
|
96
|
+
|
|
97
|
+
/* qhasm: return */
|