Skip to content

Commit f5836c8

Browse files
committed
Moved I to Curve, pass it in as a parameter
Most FieldElement implementations (in particular, the ref10 implementation) don't have a generic pow() method, and instead will have I hard-coded.
1 parent 1c4905e commit f5836c8

File tree

7 files changed

+18
-12
lines changed

7 files changed

+18
-12
lines changed

src/net/i2p/crypto/eddsa/math/Curve.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,17 @@ public class Curve implements Serializable {
1313
private final Field f;
1414
private final FieldElement d;
1515
private final FieldElement d2;
16+
private final FieldElement I;
1617

1718
private final GroupElement zeroP2;
1819
private final GroupElement zeroP3;
1920
private final GroupElement zeroPrecomp;
2021

21-
public Curve(Field f, byte[] d) {
22+
public Curve(Field f, byte[] d, FieldElement I) {
2223
this.f = f;
2324
this.d = f.fromByteArray(d);
2425
this.d2 = this.d.add(this.d);
26+
this.I = I;
2527

2628
FieldElement zero = f.zero;
2729
FieldElement one = f.one;
@@ -42,6 +44,10 @@ public FieldElement get2D() {
4244
return d2;
4345
}
4446

47+
public FieldElement getI() {
48+
return I;
49+
}
50+
4551
public GroupElement getZero(GroupElement.Representation repr) {
4652
switch (repr) {
4753
case P2:

src/net/i2p/crypto/eddsa/math/Field.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ public class Field implements Serializable {
2828
*/
2929
private final FieldElement qm5d8;
3030
private final Encoding enc;
31-
private final FieldElement I;
3231

3332
public Field(int b, byte[] q, Encoding enc) {
3433
this.b = b;
@@ -48,7 +47,6 @@ public Field(int b, byte[] q, Encoding enc) {
4847
// Precompute values
4948
qm2 = this.q.subtract(two);
5049
qm5d8 = this.q.subtract(five).divide(eight);
51-
I = two.pow(this.q.subtract(one).divide(four));
5250
}
5351

5452
public FieldElement fromByteArray(byte[] x) {
@@ -75,10 +73,6 @@ public Encoding getEncoding(){
7573
return enc;
7674
}
7775

78-
public FieldElement getI() {
79-
return I;
80-
}
81-
8276
@Override
8377
public int hashCode() {
8478
return q.hashCode();

src/net/i2p/crypto/eddsa/math/FieldElement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,5 @@ public FieldElement divide(FieldElement val) {
4747

4848
public abstract FieldElement invert();
4949

50-
public abstract FieldElement pow(FieldElement e);
50+
public abstract FieldElement pow22523();
5151
}

src/net/i2p/crypto/eddsa/math/GroupElement.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public GroupElement(Curve curve, byte[] s) {
117117
x = v3.square().multiply(v).multiply(u);
118118

119119
// x = (uv^7)^((q-5)/8)
120-
x = x.pow(curve.getField().getQm5d8());
120+
x = x.pow22523();
121121

122122
// x = uv^3(uv^7)^((q-5)/8)
123123
x = v3.multiply(u).multiply(x);
@@ -129,7 +129,7 @@ public GroupElement(Curve curve, byte[] s) {
129129

130130
if (check.isNonZero())
131131
throw new IllegalArgumentException("not a valid GroupElement");
132-
x = x.multiply(curve.getField().getI());
132+
x = x.multiply(curve.getI());
133133
}
134134

135135
if ((x.isNegative() ? 1 : 0) != Utils.bit(s, curve.getField().getb()-1)) {

src/net/i2p/crypto/eddsa/math/bigint/BigIntegerFieldElement.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ public FieldElement pow(FieldElement e){
8989
return modPow(e, f.getQ());
9090
}
9191

92+
public FieldElement pow22523(){
93+
return pow(f.getQm5d8());
94+
}
95+
9296
@Override
9397
public int hashCode() {
9498
return bi.hashCode();

src/net/i2p/crypto/eddsa/spec/EdDSANamedCurveTable.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import net.i2p.crypto.eddsa.Utils;
66
import net.i2p.crypto.eddsa.math.Curve;
77
import net.i2p.crypto.eddsa.math.Field;
8+
import net.i2p.crypto.eddsa.math.bigint.BigIntegerFieldElement;
89
import net.i2p.crypto.eddsa.math.bigint.BigIntegerLittleEndianEncoding;
910
import net.i2p.crypto.eddsa.math.ed25519.Ed25519ScalarOps;
1011

@@ -22,7 +23,8 @@ public class EdDSANamedCurveTable {
2223
new BigIntegerLittleEndianEncoding());
2324

2425
private static final Curve ed25519curve = new Curve(ed25519field,
25-
Utils.hexToBytes("a3785913ca4deb75abd841414d0a700098e879777940c78c73fe6f2bee6c0352")); // d
26+
Utils.hexToBytes("a3785913ca4deb75abd841414d0a700098e879777940c78c73fe6f2bee6c0352"), // d
27+
((BigIntegerFieldElement)ed25519field.two).pow(ed25519field.getQ().subtractOne().divide(ed25519field.four))); // I
2628

2729
private static final EdDSANamedCurveSpec ed25519sha512 = new EdDSANamedCurveSpec(
2830
CURVE_ED25519_SHA512,

test/net/i2p/crypto/eddsa/math/ConstantsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public void testd() {
6464
@Test
6565
public void testI() {
6666
FieldElement q = curve.getField().getQ();
67-
assertThat(curve.getField().getI().modPow(curve.getField().two, q), is(equalTo(q.subtractOne())));
67+
assertThat(curve.getI().modPow(curve.getField().two, q), is(equalTo(q.subtractOne())));
6868
}*/
6969

7070
@Test

0 commit comments

Comments
 (0)