Skip to content

Commit e53939f

Browse files
committed
Latest XDH, EdDSA updates from bc-java
1 parent 93b32a7 commit e53939f

File tree

5 files changed

+938
-515
lines changed

5 files changed

+938
-515
lines changed

crypto/src/math/ec/rfc7748/X25519.cs

Lines changed: 50 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ public abstract class X25519
1212
public const int PointSize = 32;
1313
public const int ScalarSize = 32;
1414

15+
private class F : X25519Field {};
16+
1517
private const int C_A = 486662;
1618
private const int C_A24 = (C_A + 2)/4;
1719

@@ -61,17 +63,17 @@ public static void GeneratePublicKey(byte[] k, int kOff, byte[] r, int rOff)
6163

6264
private static void PointDouble(int[] x, int[] z)
6365
{
64-
int[] A = X25519Field.Create();
65-
int[] B = X25519Field.Create();
66-
67-
X25519Field.Apm(x, z, A, B);
68-
X25519Field.Sqr(A, A);
69-
X25519Field.Sqr(B, B);
70-
X25519Field.Mul(A, B, x);
71-
X25519Field.Sub(A, B, A);
72-
X25519Field.Mul(A, C_A24, z);
73-
X25519Field.Add(z, B, z);
74-
X25519Field.Mul(z, A, z);
66+
int[] a = F.Create();
67+
int[] b = F.Create();
68+
69+
F.Apm(x, z, a, b);
70+
F.Sqr(a, a);
71+
F.Sqr(b, b);
72+
F.Mul(a, b, x);
73+
F.Sub(a, b, a);
74+
F.Mul(a, C_A24, z);
75+
F.Add(z, b, z);
76+
F.Mul(z, a, z);
7577
}
7678

7779
public static void Precompute()
@@ -83,45 +85,45 @@ public static void ScalarMult(byte[] k, int kOff, byte[] u, int uOff, byte[] r,
8385
{
8486
uint[] n = new uint[8]; DecodeScalar(k, kOff, n);
8587

86-
int[] x1 = X25519Field.Create(); X25519Field.Decode(u, uOff, x1);
87-
int[] x2 = X25519Field.Create(); X25519Field.Copy(x1, 0, x2, 0);
88-
int[] z2 = X25519Field.Create(); z2[0] = 1;
89-
int[] x3 = X25519Field.Create(); x3[0] = 1;
90-
int[] z3 = X25519Field.Create();
88+
int[] x1 = F.Create(); F.Decode(u, uOff, x1);
89+
int[] x2 = F.Create(); F.Copy(x1, 0, x2, 0);
90+
int[] z2 = F.Create(); z2[0] = 1;
91+
int[] x3 = F.Create(); x3[0] = 1;
92+
int[] z3 = F.Create();
9193

92-
int[] t1 = X25519Field.Create();
93-
int[] t2 = X25519Field.Create();
94+
int[] t1 = F.Create();
95+
int[] t2 = F.Create();
9496

9597
Debug.Assert(n[7] >> 30 == 1U);
9698

9799
int bit = 254, swap = 1;
98100
do
99101
{
100-
X25519Field.Apm(x3, z3, t1, x3);
101-
X25519Field.Apm(x2, z2, z3, x2);
102-
X25519Field.Mul(t1, x2, t1);
103-
X25519Field.Mul(x3, z3, x3);
104-
X25519Field.Sqr(z3, z3);
105-
X25519Field.Sqr(x2, x2);
106-
107-
X25519Field.Sub(z3, x2, t2);
108-
X25519Field.Mul(t2, C_A24, z2);
109-
X25519Field.Add(z2, x2, z2);
110-
X25519Field.Mul(z2, t2, z2);
111-
X25519Field.Mul(x2, z3, x2);
112-
113-
X25519Field.Apm(t1, x3, x3, z3);
114-
X25519Field.Sqr(x3, x3);
115-
X25519Field.Sqr(z3, z3);
116-
X25519Field.Mul(z3, x1, z3);
102+
F.Apm(x3, z3, t1, x3);
103+
F.Apm(x2, z2, z3, x2);
104+
F.Mul(t1, x2, t1);
105+
F.Mul(x3, z3, x3);
106+
F.Sqr(z3, z3);
107+
F.Sqr(x2, x2);
108+
109+
F.Sub(z3, x2, t2);
110+
F.Mul(t2, C_A24, z2);
111+
F.Add(z2, x2, z2);
112+
F.Mul(z2, t2, z2);
113+
F.Mul(x2, z3, x2);
114+
115+
F.Apm(t1, x3, x3, z3);
116+
F.Sqr(x3, x3);
117+
F.Sqr(z3, z3);
118+
F.Mul(z3, x1, z3);
117119

118120
--bit;
119121

120122
int word = bit >> 5, shift = bit & 0x1F;
121123
int kt = (int)(n[word] >> shift) & 1;
122124
swap ^= kt;
123-
X25519Field.CSwap(swap, x2, x3);
124-
X25519Field.CSwap(swap, z2, z3);
125+
F.CSwap(swap, x2, x3);
126+
F.CSwap(swap, z2, z3);
125127
swap = kt;
126128
}
127129
while (bit >= 3);
@@ -133,27 +135,27 @@ public static void ScalarMult(byte[] k, int kOff, byte[] u, int uOff, byte[] r,
133135
PointDouble(x2, z2);
134136
}
135137

136-
X25519Field.Inv(z2, z2);
137-
X25519Field.Mul(x2, z2, x2);
138+
F.Inv(z2, z2);
139+
F.Mul(x2, z2, x2);
138140

139-
X25519Field.Normalize(x2);
140-
X25519Field.Encode(x2, r, rOff);
141+
F.Normalize(x2);
142+
F.Encode(x2, r, rOff);
141143
}
142144

143145
public static void ScalarMultBase(byte[] k, int kOff, byte[] r, int rOff)
144146
{
145-
int[] y = X25519Field.Create();
146-
int[] z = X25519Field.Create();
147+
int[] y = F.Create();
148+
int[] z = F.Create();
147149

148150
Ed25519.ScalarMultBaseYZ(k, kOff, y, z);
149151

150-
X25519Field.Apm(z, y, y, z);
152+
F.Apm(z, y, y, z);
151153

152-
X25519Field.Inv(z, z);
153-
X25519Field.Mul(y, z, y);
154+
F.Inv(z, z);
155+
F.Mul(y, z, y);
154156

155-
X25519Field.Normalize(y);
156-
X25519Field.Encode(y, r, rOff);
157+
F.Normalize(y);
158+
F.Encode(y, r, rOff);
157159
}
158160
}
159161
}

crypto/src/math/ec/rfc7748/X448.cs

Lines changed: 59 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ public abstract class X448
1212
public const int PointSize = 56;
1313
public const int ScalarSize = 56;
1414

15+
private class F : X448Field {};
16+
1517
private const uint C_A = 156326;
1618
private const uint C_A24 = (C_A + 2)/4;
1719

@@ -60,19 +62,19 @@ public static void GeneratePublicKey(byte[] k, int kOff, byte[] r, int rOff)
6062

6163
private static void PointDouble(uint[] x, uint[] z)
6264
{
63-
uint[] A = X448Field.Create();
64-
uint[] B = X448Field.Create();
65-
66-
//X448Field.Apm(x, z, A, B);
67-
X448Field.Add(x, z, A);
68-
X448Field.Sub(x, z, B);
69-
X448Field.Sqr(A, A);
70-
X448Field.Sqr(B, B);
71-
X448Field.Mul(A, B, x);
72-
X448Field.Sub(A, B, A);
73-
X448Field.Mul(A, C_A24, z);
74-
X448Field.Add(z, B, z);
75-
X448Field.Mul(z, A, z);
65+
uint[] a = F.Create();
66+
uint[] b = F.Create();
67+
68+
//F.Apm(x, z, a, b);
69+
F.Add(x, z, a);
70+
F.Sub(x, z, b);
71+
F.Sqr(a, a);
72+
F.Sqr(b, b);
73+
F.Mul(a, b, x);
74+
F.Sub(a, b, a);
75+
F.Mul(a, C_A24, z);
76+
F.Add(z, b, z);
77+
F.Mul(z, a, z);
7678
}
7779

7880
public static void Precompute()
@@ -84,52 +86,52 @@ public static void ScalarMult(byte[] k, int kOff, byte[] u, int uOff, byte[] r,
8486
{
8587
uint[] n = new uint[14]; DecodeScalar(k, kOff, n);
8688

87-
uint[] x1 = X448Field.Create(); X448Field.Decode(u, uOff, x1);
88-
uint[] x2 = X448Field.Create(); X448Field.Copy(x1, 0, x2, 0);
89-
uint[] z2 = X448Field.Create(); z2[0] = 1;
90-
uint[] x3 = X448Field.Create(); x3[0] = 1;
91-
uint[] z3 = X448Field.Create();
89+
uint[] x1 = F.Create(); F.Decode(u, uOff, x1);
90+
uint[] x2 = F.Create(); F.Copy(x1, 0, x2, 0);
91+
uint[] z2 = F.Create(); z2[0] = 1;
92+
uint[] x3 = F.Create(); x3[0] = 1;
93+
uint[] z3 = F.Create();
9294

93-
uint[] t1 = X448Field.Create();
94-
uint[] t2 = X448Field.Create();
95+
uint[] t1 = F.Create();
96+
uint[] t2 = F.Create();
9597

9698
Debug.Assert(n[13] >> 31 == 1U);
9799

98100
int bit = 447, swap = 1;
99101
do
100102
{
101-
//X448Field.Apm(x3, z3, t1, x3);
102-
X448Field.Add(x3, z3, t1);
103-
X448Field.Sub(x3, z3, x3);
104-
//X448Field.Apm(x2, z2, z3, x2);
105-
X448Field.Add(x2, z2, z3);
106-
X448Field.Sub(x2, z2, x2);
107-
108-
X448Field.Mul(t1, x2, t1);
109-
X448Field.Mul(x3, z3, x3);
110-
X448Field.Sqr(z3, z3);
111-
X448Field.Sqr(x2, x2);
112-
113-
X448Field.Sub(z3, x2, t2);
114-
X448Field.Mul(t2, C_A24, z2);
115-
X448Field.Add(z2, x2, z2);
116-
X448Field.Mul(z2, t2, z2);
117-
X448Field.Mul(x2, z3, x2);
118-
119-
//X448Field.Apm(t1, x3, x3, z3);
120-
X448Field.Sub(t1, x3, z3);
121-
X448Field.Add(t1, x3, x3);
122-
X448Field.Sqr(x3, x3);
123-
X448Field.Sqr(z3, z3);
124-
X448Field.Mul(z3, x1, z3);
103+
//F.Apm(x3, z3, t1, x3);
104+
F.Add(x3, z3, t1);
105+
F.Sub(x3, z3, x3);
106+
//F.Apm(x2, z2, z3, x2);
107+
F.Add(x2, z2, z3);
108+
F.Sub(x2, z2, x2);
109+
110+
F.Mul(t1, x2, t1);
111+
F.Mul(x3, z3, x3);
112+
F.Sqr(z3, z3);
113+
F.Sqr(x2, x2);
114+
115+
F.Sub(z3, x2, t2);
116+
F.Mul(t2, C_A24, z2);
117+
F.Add(z2, x2, z2);
118+
F.Mul(z2, t2, z2);
119+
F.Mul(x2, z3, x2);
120+
121+
//F.Apm(t1, x3, x3, z3);
122+
F.Sub(t1, x3, z3);
123+
F.Add(t1, x3, x3);
124+
F.Sqr(x3, x3);
125+
F.Sqr(z3, z3);
126+
F.Mul(z3, x1, z3);
125127

126128
--bit;
127129

128130
int word = bit >> 5, shift = bit & 0x1F;
129131
int kt = (int)(n[word] >> shift) & 1;
130132
swap ^= kt;
131-
X448Field.CSwap(swap, x2, x3);
132-
X448Field.CSwap(swap, z2, z3);
133+
F.CSwap(swap, x2, x3);
134+
F.CSwap(swap, z2, z3);
133135
swap = kt;
134136
}
135137
while (bit >= 2);
@@ -141,26 +143,26 @@ public static void ScalarMult(byte[] k, int kOff, byte[] u, int uOff, byte[] r,
141143
PointDouble(x2, z2);
142144
}
143145

144-
X448Field.Inv(z2, z2);
145-
X448Field.Mul(x2, z2, x2);
146+
F.Inv(z2, z2);
147+
F.Mul(x2, z2, x2);
146148

147-
X448Field.Normalize(x2);
148-
X448Field.Encode(x2, r, rOff);
149+
F.Normalize(x2);
150+
F.Encode(x2, r, rOff);
149151
}
150152

151153
public static void ScalarMultBase(byte[] k, int kOff, byte[] r, int rOff)
152154
{
153-
uint[] x = X448Field.Create();
154-
uint[] y = X448Field.Create();
155+
uint[] x = F.Create();
156+
uint[] y = F.Create();
155157

156158
Ed448.ScalarMultBaseXY(k, kOff, x, y);
157159

158-
X448Field.Inv(x, x);
159-
X448Field.Mul(x, y, x);
160-
X448Field.Sqr(x, x);
160+
F.Inv(x, x);
161+
F.Mul(x, y, x);
162+
F.Sqr(x, x);
161163

162-
X448Field.Normalize(x);
163-
X448Field.Encode(x, r, rOff);
164+
F.Normalize(x);
165+
F.Encode(x, r, rOff);
164166
}
165167
}
166168
}

crypto/src/math/ec/rfc7748/X448Field.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ public static uint[] Create()
120120
return new uint[Size];
121121
}
122122

123+
public static uint[] CreateTable(int n)
124+
{
125+
return new uint[Size * n];
126+
}
127+
123128
public static void CSwap(int swap, uint[] a, uint[] b)
124129
{
125130
Debug.Assert(swap >> 1 == 0);

0 commit comments

Comments
 (0)