Skip to content

Commit b524d1e

Browse files
author
gefeili
committed
Remove GF16Utils.add
1 parent 7d4df68 commit b524d1e

File tree

4 files changed

+60
-103
lines changed

4 files changed

+60
-103
lines changed

core/src/main/java/org/bouncycastle/pqc/crypto/snova/GF16Utils.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,6 @@ public static byte mul(byte a, byte b)
207207
return MT4B[(a & 0xF) << 4 | (b & 0xF)];
208208
}
209209

210-
public static byte add(byte a, byte b)
211-
{
212-
return (byte)((a ^ b) & 0xF);
213-
}
214-
215210
public static byte inv(byte a)
216211
{
217212
return INV4B[a & 0xF];

core/src/main/java/org/bouncycastle/pqc/crypto/snova/SnovaEngine.java

Lines changed: 30 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -186,63 +186,51 @@ private byte determinant3x3(byte[] m, int off, int i0, int i1, int i2)
186186

187187
private byte determinant4x4(byte[] m, int off)
188188
{
189-
byte d0 = gf16Mul(getGF16m(m, 0, off), gf16Add(
190-
gf16Add(
191-
pod(m, off, 1, 2, 3, 3, 2),
192-
pod(m, off, 2, 1, 3, 3, 1)
193-
),
194-
pod(m, off, 3, 1, 2, 2, 1)
195-
));
196-
197-
byte d1 = gf16Mul(getGF16m(m, 0, off + 1), gf16Add(
198-
gf16Add(
199-
pod(m, off, 0, 2, 3, 3, 2),
200-
pod(m, off, 2, 0, 3, 3, 0)
201-
),
202-
pod(m, off, 3, 0, 2, 2, 0)
203-
));
204-
205-
byte d2 = gf16Mul(getGF16m(m, 0, off + 2), gf16Add(
206-
gf16Add(
207-
pod(m, off, 0, 1, 3, 3, 1),
208-
pod(m, off, 1, 0, 3, 3, 0)
209-
),
210-
pod(m, off, 3, 0, 1, 1, 0)
211-
));
212-
213-
byte d3 = gf16Mul(getGF16m(m, 0, off + 3), gf16Add(
214-
gf16Add(
215-
pod(m, off, 0, 1, 2, 2, 1),
216-
pod(m, off, 1, 0, 2, 2, 0)
217-
),
218-
pod(m, off, 2, 0, 1, 1, 0)
219-
));
189+
byte d0 = gf16Mul(getGF16m(m, 0, off), (byte)(
190+
pod(m, off, 1, 2, 3, 3, 2) ^
191+
pod(m, off, 2, 1, 3, 3, 1) ^
192+
pod(m, off, 3, 1, 2, 2, 1)));
193+
194+
byte d1 = gf16Mul(getGF16m(m, 0, off + 1), (byte)(
195+
pod(m, off, 0, 2, 3, 3, 2) ^
196+
pod(m, off, 2, 0, 3, 3, 0) ^
197+
pod(m, off, 3, 0, 2, 2, 0)));
198+
199+
byte d2 = gf16Mul(getGF16m(m, 0, off + 2), (byte)(
200+
pod(m, off, 0, 1, 3, 3, 1) ^
201+
pod(m, off, 1, 0, 3, 3, 0) ^
202+
pod(m, off, 3, 0, 1, 1, 0)));
203+
204+
byte d3 = gf16Mul(getGF16m(m, 0, off + 3), (byte)(
205+
pod(m, off, 0, 1, 2, 2, 1) ^
206+
pod(m, off, 1, 0, 2, 2, 0) ^
207+
pod(m, off, 2, 0, 1, 1, 0)));
220208

221209
return (byte)(d0 ^ d1 ^ d2 ^ d3);
222210
}
223211

224212
private byte determinant5x5(byte[] m, int off)
225213
{
226214
byte result = gf16Mul(determinant3x3(m, off, 0, 1, 2),
227-
gf16Add(gf16Mul(getGF16m(m, 3, off + 3), getGF16m(m, 4, off + 4)), gf16Mul(getGF16m(m, 3, off + 4), getGF16m(m, 4, off + 3))));
215+
(byte)(gf16Mul(getGF16m(m, 3, off + 3), getGF16m(m, 4, off + 4)) ^ gf16Mul(getGF16m(m, 3, off + 4), getGF16m(m, 4, off + 3))));
228216
result ^= gf16Mul(determinant3x3(m, off, 0, 1, 3),
229-
gf16Add(gf16Mul(getGF16m(m, 3, off + 2), getGF16m(m, 4, off + 4)), gf16Mul(getGF16m(m, 3, off + 4), getGF16m(m, 4, off + 2))));
217+
(byte)(gf16Mul(getGF16m(m, 3, off + 2), getGF16m(m, 4, off + 4)) ^ gf16Mul(getGF16m(m, 3, off + 4), getGF16m(m, 4, off + 2))));
230218
result ^= gf16Mul(determinant3x3(m, off, 0, 1, 4),
231-
gf16Add(gf16Mul(getGF16m(m, 3, off + 2), getGF16m(m, 4, off + 3)), gf16Mul(getGF16m(m, 3, off + 3), getGF16m(m, 4, off + 2))));
219+
(byte)(gf16Mul(getGF16m(m, 3, off + 2), getGF16m(m, 4, off + 3)) ^ gf16Mul(getGF16m(m, 3, off + 3), getGF16m(m, 4, off + 2))));
232220
result ^= gf16Mul(determinant3x3(m, off, 0, 2, 3),
233-
gf16Add(gf16Mul(getGF16m(m, 3, off + 1), getGF16m(m, 4, off + 4)), gf16Mul(getGF16m(m, 3, off + 4), getGF16m(m, 4, off + 1))));
221+
(byte)(gf16Mul(getGF16m(m, 3, off + 1), getGF16m(m, 4, off + 4)) ^ gf16Mul(getGF16m(m, 3, off + 4), getGF16m(m, 4, off + 1))));
234222
result ^= gf16Mul(determinant3x3(m, off, 0, 2, 4),
235-
gf16Add(gf16Mul(getGF16m(m, 3, off + 1), getGF16m(m, 4, off + 3)), gf16Mul(getGF16m(m, 3, off + 3), getGF16m(m, 4, off + 1))));
223+
(byte)(gf16Mul(getGF16m(m, 3, off + 1), getGF16m(m, 4, off + 3)) ^ gf16Mul(getGF16m(m, 3, off + 3), getGF16m(m, 4, off + 1))));
236224
result ^= gf16Mul(determinant3x3(m, off, 0, 3, 4),
237-
gf16Add(gf16Mul(getGF16m(m, 3, off + 1), getGF16m(m, 4, off + 2)), gf16Mul(getGF16m(m, 3, off + 2), getGF16m(m, 4, off + 1))));
225+
(byte)(gf16Mul(getGF16m(m, 3, off + 1), getGF16m(m, 4, off + 2)) ^ gf16Mul(getGF16m(m, 3, off + 2), getGF16m(m, 4, off + 1))));
238226
result ^= gf16Mul(determinant3x3(m, off, 1, 2, 3),
239-
gf16Add(gf16Mul(getGF16m(m, 3, off), getGF16m(m, 4, off + 4)), gf16Mul(getGF16m(m, 3, off + 4), getGF16m(m, 4, off))));
227+
(byte)(gf16Mul(getGF16m(m, 3, off), getGF16m(m, 4, off + 4)) ^ gf16Mul(getGF16m(m, 3, off + 4), getGF16m(m, 4, off))));
240228
result ^= gf16Mul(determinant3x3(m, off, 1, 2, 4),
241-
gf16Add(gf16Mul(getGF16m(m, 3, off), getGF16m(m, 4, off + 3)), gf16Mul(getGF16m(m, 3, off + 3), getGF16m(m, 4, off))));
229+
(byte)(gf16Mul(getGF16m(m, 3, off), getGF16m(m, 4, off + 3)) ^ gf16Mul(getGF16m(m, 3, off + 3), getGF16m(m, 4, off))));
242230
result ^= gf16Mul(determinant3x3(m, off, 1, 3, 4),
243-
gf16Add(gf16Mul(getGF16m(m, 3, off), getGF16m(m, 4, off + 2)), gf16Mul(getGF16m(m, 3, off + 2), getGF16m(m, 4, off))));
231+
(byte)(gf16Mul(getGF16m(m, 3, off), getGF16m(m, 4, off + 2)) ^ gf16Mul(getGF16m(m, 3, off + 2), getGF16m(m, 4, off))));
244232
result ^= gf16Mul(determinant3x3(m, off, 2, 3, 4),
245-
gf16Add(gf16Mul(getGF16m(m, 3, off), getGF16m(m, 4, off + 1)), gf16Mul(getGF16m(m, 3, off + 1), getGF16m(m, 4, off))));
233+
(byte)(gf16Mul(getGF16m(m, 3, off), getGF16m(m, 4, off + 1)) ^ gf16Mul(getGF16m(m, 3, off + 1), getGF16m(m, 4, off))));
246234
return result;
247235
}
248236

@@ -274,17 +262,11 @@ private void addMatrices(byte[] a, int aOff, byte[] b, int bOff, byte[] c, int c
274262
{
275263
for (int j = 0; j < l; j++)
276264
{
277-
setGF16m(c, i, cOff + j, gf16Add(getGF16m(a, i, aOff + j), getGF16m(b, i, bOff + j)));
265+
setGF16m(c, i, cOff + j, (byte)(getGF16m(a, i, aOff + j) ^ getGF16m(b, i, bOff + j)));
278266
}
279267
}
280268
}
281269

282-
// GF(16) arithmetic
283-
private static byte gf16Add(byte a, byte b)
284-
{
285-
return (byte)(a ^ b);
286-
}
287-
288270
// GF(16) multiplication using lookup table
289271
private static byte gf16Mul(byte a, byte b)
290272
{

core/src/main/java/org/bouncycastle/pqc/crypto/snova/SnovaSigner.java

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ public void signDigestCore(byte[] ptSignature, byte[] digest, byte[] arraySalt,
300300
int colRight = ti % l;
301301
byte valRight = rightXtmp[rowRight][colRight];
302302
byte product = GF16Utils.mul(valA, valRight);
303-
Temp[ti][tj] = GF16Utils.add(Temp[ti][tj], product);
303+
Temp[ti][tj] ^= product;
304304
}
305305
}
306306
}
@@ -311,7 +311,7 @@ public void signDigestCore(byte[] ptSignature, byte[] digest, byte[] arraySalt,
311311
{
312312
int gaussRow = mi * lsq + ti;
313313
int gaussCol = index * lsq + tj;
314-
Gauss[gaussRow][gaussCol] = GF16Utils.add(Gauss[gaussRow][gaussCol], Temp[ti][tj]);
314+
Gauss[gaussRow][gaussCol] ^= Temp[ti][tj];
315315
}
316316
}
317317
}
@@ -548,10 +548,10 @@ private void multiplyGF16Matrices(byte[][] a, byte[][] b, byte[][] result)
548548
byte sum = 0;
549549
for (int k = 0; k < params.getL(); k++)
550550
{
551-
sum = GF16Utils.add(sum, GF16Utils.mul(
551+
sum ^= GF16Utils.mul(
552552
a[i][k],
553553
b[k][j]
554-
));
554+
);
555555
}
556556
result[i][j] = sum;
557557
}
@@ -568,10 +568,9 @@ private void multiplyGF16Matrices(byte[][] a, byte[] b, byte[][] result)
568568
byte sum = 0;
569569
for (int k = 0; k < params.getL(); k++)
570570
{
571-
sum = GF16Utils.add(sum, GF16Utils.mul(
571+
sum ^= GF16Utils.mul(
572572
a[i][k],
573-
engine.getGF16m(b, k, j)
574-
));
573+
engine.getGF16m(b, k, j));
575574
}
576575
result[i][j] = sum;
577576
}
@@ -588,10 +587,9 @@ private void multiplyGF16Matrices(byte[] a, byte[][] b, byte[][] result)
588587
byte sum = 0;
589588
for (int k = 0; k < params.getL(); k++)
590589
{
591-
sum = GF16Utils.add(sum, GF16Utils.mul(
590+
sum ^= GF16Utils.mul(
592591
engine.getGF16m(a, i, k),
593-
b[k][j]
594-
));
592+
b[k][j]);
595593
}
596594
result[i][j] = sum;
597595
}
@@ -608,10 +606,9 @@ private void multiplyGF16Matrices(byte[] a, byte[] b, byte[][] result)
608606
byte sum = 0;
609607
for (int k = 0; k < params.getL(); k++)
610608
{
611-
sum = GF16Utils.add(sum, GF16Utils.mul(
609+
sum ^= GF16Utils.mul(
612610
engine.getGF16m(a, i, k),
613-
engine.getGF16m(b, k, j)
614-
));
611+
engine.getGF16m(b, k, j));
615612
}
616613
result[i][j] = sum;
617614
}
@@ -660,7 +657,7 @@ private int performGaussianElimination(byte[][] Gauss, byte[] solution, int size
660657
{
661658
for (int k = i; k < cols; k++)
662659
{
663-
Gauss[j][k] = GF16Utils.add(Gauss[j][k], GF16Utils.mul(Gauss[i][k], factor));
660+
Gauss[j][k] ^= GF16Utils.mul(Gauss[i][k], factor);
664661
}
665662
}
666663
}
@@ -672,7 +669,7 @@ private int performGaussianElimination(byte[][] Gauss, byte[] solution, int size
672669
solution[i] = Gauss[i][size];
673670
for (int j = i + 1; j < size; j++)
674671
{
675-
solution[i] = GF16Utils.add(solution[i], GF16Utils.mul(Gauss[i][j], solution[j]));
672+
solution[i] ^= GF16Utils.mul(Gauss[i][j], solution[j]);
676673
}
677674
}
678675

@@ -685,7 +682,7 @@ private void addGF16Matrices(byte[] a, byte[][] b, byte[] result)
685682
{
686683
for (int j = 0; j < b[i].length; ++j)
687684
{
688-
engine.setGF16m(result, i, j, GF16Utils.add(engine.getGF16m(a, i, j), b[i][j]));
685+
engine.setGF16m(result, i, j, (byte)(engine.getGF16m(a, i, j) ^ b[i][j]));
689686
}
690687
}
691688
}
@@ -696,7 +693,7 @@ private void addGF16Matrices(byte[][] a, byte[][] b, byte[][] result)
696693
{
697694
for (int j = 0; j < b[i].length; ++j)
698695
{
699-
result[i][j] = GF16Utils.add(a[i][j], b[i][j]);
696+
result[i][j] = (byte)(a[i][j] ^ b[i][j]);
700697
}
701698
}
702699
}

core/src/test/java/org/bouncycastle/pqc/crypto/test/TestUtils.java

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public static void testTestVector(boolean enableFactory, boolean isSigner, Strin
5353
String name = files[fileIndex];
5454
InputStream src = TestResourceFinder.findTestResource(homeDir, name);
5555
BufferedReader bin = new BufferedReader(new InputStreamReader(src));
56-
56+
//System.out.println(files[fileIndex]);
5757
String line;
5858
HashMap<String, String> buf = new HashMap<String, String>();
5959
while ((line = bin.readLine()) != null)
@@ -101,24 +101,7 @@ public static void testTestVector(boolean enableFactory, boolean isSigner, Strin
101101
pubParams = kp.getPublic();
102102
privParams = kp.getPrivate();
103103
}
104-
// byte[] pk2 = operation.getPublicKeyEncoded(pubParams);
105-
// for (int i = 0; i < pk2.length; ++i)
106-
// {
107-
// if (pk[i] != pk2[i])
108-
// {
109-
// System.out.println(i + " " + pk[i] + " " + pk2[i]);
110-
// }
111-
// }
112-
//
113-
// byte[] sk2 = operation.getPrivateKeyEncoded(privParams);
114-
// System.out.println(new String(Hex.encode(sk2)));
115-
// for (int i = 0; i < sk2.length; ++i)
116-
// {
117-
// if (sk[i] != sk2[i])
118-
// {
119-
// System.out.println(i + " " + sk[i] + " " + sk2[i]);
120-
// }
121-
// }
104+
122105
Assert.assertTrue(name + ": public key", Arrays.areEqual(pk, operation.getPublicKeyEncoded(pubParams)));
123106
Assert.assertTrue(name + ": secret key", Arrays.areEqual(sk, operation.getPrivateKeyEncoded(privParams)));
124107

@@ -140,20 +123,20 @@ public static void testTestVector(boolean enableFactory, boolean isSigner, Strin
140123

141124
Assert.assertTrue(Arrays.areEqual(sigGenerated, signature));
142125

143-
// if (isSigner)
144-
// {
145-
// Signer signer = operation.getSigner();
146-
// signer.init(false, pubParams);
147-
// signer.update(message, 0, message.length);
148-
// Assert.assertTrue(signer.verifySignature(sigGenerated));
149-
// }
150-
// else
151-
// {
152-
// MessageSigner signer = operation.getMessageSigner();
153-
// signer.init(false, pubParams);
154-
// Assert.assertTrue(signer.verifySignature(message, sigGenerated));
155-
// }
156-
// System.out.println("Count " + count + " pass");
126+
if (isSigner)
127+
{
128+
Signer signer = operation.getSigner();
129+
signer.init(false, pubParams);
130+
signer.update(message, 0, message.length);
131+
Assert.assertTrue(signer.verifySignature(sigGenerated));
132+
}
133+
else
134+
{
135+
MessageSigner signer = operation.getMessageSigner();
136+
signer.init(false, pubParams);
137+
Assert.assertTrue(signer.verifySignature(message, sigGenerated));
138+
}
139+
System.out.println("Count " + count + " pass");
157140
}
158141
buf.clear();
159142
continue;

0 commit comments

Comments
 (0)