Skip to content

Commit 0bad277

Browse files
committed
Copied over ref10 sc_reduce replacing crypto_int64 and crypto_uint64 with long
The test fails (likely because all longs are signed in Java)
1 parent de42efe commit 0bad277

File tree

2 files changed

+313
-0
lines changed

2 files changed

+313
-0
lines changed
Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,276 @@
1+
package net.i2p.crypto.eddsa.math.ed25519;
2+
3+
import net.i2p.crypto.eddsa.math.ScalarOps;
4+
5+
public class Ed25519ScalarOps implements ScalarOps {
6+
private long load_3(byte[] in, int offset) {
7+
long result = in[offset];
8+
result |= in[offset + 1] << 8;
9+
result |= in[offset + 2] << 16;
10+
return result;
11+
}
12+
13+
private long load_4(byte[] in, int offset) {
14+
long result = in[offset];
15+
result |= in[offset + 1] << 8;
16+
result |= in[offset + 2] << 16;
17+
result |= in[offset + 3] << 24;
18+
return result;
19+
}
20+
21+
/**
22+
* Input:<br>
23+
* s[0]+256*s[1]+...+256^63*s[63] = s<br><br>
24+
*
25+
* Output:<br>
26+
* s[0]+256*s[1]+...+256^31*s[31] = s mod l<br>
27+
* where l = 2^252 + 27742317777372353535851937790883648493.
28+
*/
29+
public byte[] reduce(byte[] s) {
30+
long s0 = 2097151 & load_3(s, 0);
31+
long s1 = 2097151 & (load_4(s, 2) >> 5);
32+
long s2 = 2097151 & (load_3(s, 5) >> 2);
33+
long s3 = 2097151 & (load_4(s, 7) >> 7);
34+
long s4 = 2097151 & (load_4(s, 10) >> 4);
35+
long s5 = 2097151 & (load_3(s, 13) >> 1);
36+
long s6 = 2097151 & (load_4(s, 15) >> 6);
37+
long s7 = 2097151 & (load_3(s, 18) >> 3);
38+
long s8 = 2097151 & load_3(s, 21);
39+
long s9 = 2097151 & (load_4(s, 23) >> 5);
40+
long s10 = 2097151 & (load_3(s, 26) >> 2);
41+
long s11 = 2097151 & (load_4(s, 28) >> 7);
42+
long s12 = 2097151 & (load_4(s, 31) >> 4);
43+
long s13 = 2097151 & (load_3(s, 34) >> 1);
44+
long s14 = 2097151 & (load_4(s, 36) >> 6);
45+
long s15 = 2097151 & (load_3(s, 39) >> 3);
46+
long s16 = 2097151 & load_3(s, 42);
47+
long s17 = 2097151 & (load_4(s, 44) >> 5);
48+
long s18 = 2097151 & (load_3(s, 47) >> 2);
49+
long s19 = 2097151 & (load_4(s, 49) >> 7);
50+
long s20 = 2097151 & (load_4(s, 52) >> 4);
51+
long s21 = 2097151 & (load_3(s, 55) >> 1);
52+
long s22 = 2097151 & (load_4(s, 57) >> 6);
53+
long s23 = (load_4(s, 60) >> 3);
54+
long carry0;
55+
long carry1;
56+
long carry2;
57+
long carry3;
58+
long carry4;
59+
long carry5;
60+
long carry6;
61+
long carry7;
62+
long carry8;
63+
long carry9;
64+
long carry10;
65+
long carry11;
66+
long carry12;
67+
long carry13;
68+
long carry14;
69+
long carry15;
70+
long carry16;
71+
72+
s11 += s23 * 666643;
73+
s12 += s23 * 470296;
74+
s13 += s23 * 654183;
75+
s14 -= s23 * 997805;
76+
s15 += s23 * 136657;
77+
s16 -= s23 * 683901;
78+
s23 = 0;
79+
80+
s10 += s22 * 666643;
81+
s11 += s22 * 470296;
82+
s12 += s22 * 654183;
83+
s13 -= s22 * 997805;
84+
s14 += s22 * 136657;
85+
s15 -= s22 * 683901;
86+
s22 = 0;
87+
88+
s9 += s21 * 666643;
89+
s10 += s21 * 470296;
90+
s11 += s21 * 654183;
91+
s12 -= s21 * 997805;
92+
s13 += s21 * 136657;
93+
s14 -= s21 * 683901;
94+
s21 = 0;
95+
96+
s8 += s20 * 666643;
97+
s9 += s20 * 470296;
98+
s10 += s20 * 654183;
99+
s11 -= s20 * 997805;
100+
s12 += s20 * 136657;
101+
s13 -= s20 * 683901;
102+
s20 = 0;
103+
104+
s7 += s19 * 666643;
105+
s8 += s19 * 470296;
106+
s9 += s19 * 654183;
107+
s10 -= s19 * 997805;
108+
s11 += s19 * 136657;
109+
s12 -= s19 * 683901;
110+
s19 = 0;
111+
112+
s6 += s18 * 666643;
113+
s7 += s18 * 470296;
114+
s8 += s18 * 654183;
115+
s9 -= s18 * 997805;
116+
s10 += s18 * 136657;
117+
s11 -= s18 * 683901;
118+
s18 = 0;
119+
120+
carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21;
121+
carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21;
122+
carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21;
123+
carry12 = (s12 + (1<<20)) >> 21; s13 += carry12; s12 -= carry12 << 21;
124+
carry14 = (s14 + (1<<20)) >> 21; s15 += carry14; s14 -= carry14 << 21;
125+
carry16 = (s16 + (1<<20)) >> 21; s17 += carry16; s16 -= carry16 << 21;
126+
127+
carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21;
128+
carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21;
129+
carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21;
130+
carry13 = (s13 + (1<<20)) >> 21; s14 += carry13; s13 -= carry13 << 21;
131+
carry15 = (s15 + (1<<20)) >> 21; s16 += carry15; s15 -= carry15 << 21;
132+
133+
s5 += s17 * 666643;
134+
s6 += s17 * 470296;
135+
s7 += s17 * 654183;
136+
s8 -= s17 * 997805;
137+
s9 += s17 * 136657;
138+
s10 -= s17 * 683901;
139+
s17 = 0;
140+
141+
s4 += s16 * 666643;
142+
s5 += s16 * 470296;
143+
s6 += s16 * 654183;
144+
s7 -= s16 * 997805;
145+
s8 += s16 * 136657;
146+
s9 -= s16 * 683901;
147+
s16 = 0;
148+
149+
s3 += s15 * 666643;
150+
s4 += s15 * 470296;
151+
s5 += s15 * 654183;
152+
s6 -= s15 * 997805;
153+
s7 += s15 * 136657;
154+
s8 -= s15 * 683901;
155+
s15 = 0;
156+
157+
s2 += s14 * 666643;
158+
s3 += s14 * 470296;
159+
s4 += s14 * 654183;
160+
s5 -= s14 * 997805;
161+
s6 += s14 * 136657;
162+
s7 -= s14 * 683901;
163+
s14 = 0;
164+
165+
s1 += s13 * 666643;
166+
s2 += s13 * 470296;
167+
s3 += s13 * 654183;
168+
s4 -= s13 * 997805;
169+
s5 += s13 * 136657;
170+
s6 -= s13 * 683901;
171+
s13 = 0;
172+
173+
s0 += s12 * 666643;
174+
s1 += s12 * 470296;
175+
s2 += s12 * 654183;
176+
s3 -= s12 * 997805;
177+
s4 += s12 * 136657;
178+
s5 -= s12 * 683901;
179+
s12 = 0;
180+
181+
carry0 = (s0 + (1<<20)) >> 21; s1 += carry0; s0 -= carry0 << 21;
182+
carry2 = (s2 + (1<<20)) >> 21; s3 += carry2; s2 -= carry2 << 21;
183+
carry4 = (s4 + (1<<20)) >> 21; s5 += carry4; s4 -= carry4 << 21;
184+
carry6 = (s6 + (1<<20)) >> 21; s7 += carry6; s6 -= carry6 << 21;
185+
carry8 = (s8 + (1<<20)) >> 21; s9 += carry8; s8 -= carry8 << 21;
186+
carry10 = (s10 + (1<<20)) >> 21; s11 += carry10; s10 -= carry10 << 21;
187+
188+
carry1 = (s1 + (1<<20)) >> 21; s2 += carry1; s1 -= carry1 << 21;
189+
carry3 = (s3 + (1<<20)) >> 21; s4 += carry3; s3 -= carry3 << 21;
190+
carry5 = (s5 + (1<<20)) >> 21; s6 += carry5; s5 -= carry5 << 21;
191+
carry7 = (s7 + (1<<20)) >> 21; s8 += carry7; s7 -= carry7 << 21;
192+
carry9 = (s9 + (1<<20)) >> 21; s10 += carry9; s9 -= carry9 << 21;
193+
carry11 = (s11 + (1<<20)) >> 21; s12 += carry11; s11 -= carry11 << 21;
194+
195+
s0 += s12 * 666643;
196+
s1 += s12 * 470296;
197+
s2 += s12 * 654183;
198+
s3 -= s12 * 997805;
199+
s4 += s12 * 136657;
200+
s5 -= s12 * 683901;
201+
s12 = 0;
202+
203+
carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21;
204+
carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21;
205+
carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21;
206+
carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21;
207+
carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21;
208+
carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21;
209+
carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21;
210+
carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21;
211+
carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21;
212+
carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21;
213+
carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21;
214+
carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 << 21;
215+
216+
s0 += s12 * 666643;
217+
s1 += s12 * 470296;
218+
s2 += s12 * 654183;
219+
s3 -= s12 * 997805;
220+
s4 += s12 * 136657;
221+
s5 -= s12 * 683901;
222+
s12 = 0;
223+
224+
carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 << 21;
225+
carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 << 21;
226+
carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 << 21;
227+
carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 << 21;
228+
carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 << 21;
229+
carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 << 21;
230+
carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 << 21;
231+
carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 << 21;
232+
carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 << 21;
233+
carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 << 21;
234+
carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 << 21;
235+
236+
byte[] result = new byte[32];
237+
result[0] = (byte) (s0 >> 0);
238+
result[1] = (byte) (s0 >> 8);
239+
result[2] = (byte) ((s0 >> 16) | (s1 << 5));
240+
result[3] = (byte) (s1 >> 3);
241+
result[4] = (byte) (s1 >> 11);
242+
result[5] = (byte) ((s1 >> 19) | (s2 << 2));
243+
result[6] = (byte) (s2 >> 6);
244+
result[7] = (byte) ((s2 >> 14) | (s3 << 7));
245+
result[8] = (byte) (s3 >> 1);
246+
result[9] = (byte) (s3 >> 9);
247+
result[10] = (byte) ((s3 >> 17) | (s4 << 4));
248+
result[11] = (byte) (s4 >> 4);
249+
result[12] = (byte) (s4 >> 12);
250+
result[13] = (byte) ((s4 >> 20) | (s5 << 1));
251+
result[14] = (byte) (s5 >> 7);
252+
result[15] = (byte) ((s5 >> 15) | (s6 << 6));
253+
result[16] = (byte) (s6 >> 2);
254+
result[17] = (byte) (s6 >> 10);
255+
result[18] = (byte) ((s6 >> 18) | (s7 << 3));
256+
result[19] = (byte) (s7 >> 5);
257+
result[20] = (byte) (s7 >> 13);
258+
result[21] = (byte) (s8 >> 0);
259+
result[22] = (byte) (s8 >> 8);
260+
result[23] = (byte) ((s8 >> 16) | (s9 << 5));
261+
result[24] = (byte) (s9 >> 3);
262+
result[25] = (byte) (s9 >> 11);
263+
result[26] = (byte) ((s9 >> 19) | (s10 << 2));
264+
result[27] = (byte) (s10 >> 6);
265+
result[28] = (byte) ((s10 >> 14) | (s11 << 7));
266+
result[29] = (byte) (s11 >> 1);
267+
result[30] = (byte) (s11 >> 9);
268+
result[31] = (byte) (s11 >> 17);
269+
return result;
270+
}
271+
272+
public byte[] multiplyAndAdd(byte[] a, byte[] b, byte[] c) {
273+
// TODO Auto-generated method stub
274+
return null;
275+
}
276+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
*
3+
*/
4+
package net.i2p.crypto.eddsa.math.ed25519;
5+
6+
import static org.hamcrest.Matchers.*;
7+
import static org.junit.Assert.*;
8+
9+
import net.i2p.crypto.eddsa.Utils;
10+
import net.i2p.crypto.eddsa.math.ScalarOps;
11+
import org.junit.Test;
12+
13+
/**
14+
* @author str4d
15+
*
16+
*/
17+
public class Ed25519ScalarOpsTest {
18+
/**
19+
* Test method for {@link net.i2p.crypto.eddsa.math.bigint.BigIntegerScalarOps#reduce(byte[])}.
20+
*/
21+
@Test
22+
public void testReduce() {
23+
ScalarOps sc = new Ed25519ScalarOps();
24+
// Example from test case 1
25+
byte[] r = Utils.hexToBytes("b6b19cd8e0426f5983fa112d89a143aa97dab8bc5deb8d5b6253c928b65272f4044098c2a990039cde5b6a4818df0bfb6e40dc5dee54248032962323e701352d");
26+
assertThat(sc.reduce(r), is(equalTo(Utils.hexToBytes("f38907308c893deaf244787db4af53682249107418afc2edc58f75ac58a07404"))));
27+
}
28+
29+
/**
30+
* Test method for {@link net.i2p.crypto.eddsa.math.bigint.BigIntegerScalarOps#multiplyAndAdd(byte[], byte[], byte[])}.
31+
*/
32+
@Test
33+
public void testMultiplyAndAdd() {
34+
fail("Not yet implemented");
35+
}
36+
37+
}

0 commit comments

Comments
 (0)