Skip to content

Commit 54b3283

Browse files
author
gefeili
committed
TODO: Evaluate vinegar part of central map
1 parent cff8aa0 commit 54b3283

File tree

4 files changed

+126
-109
lines changed

4 files changed

+126
-109
lines changed

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public void encodeMergerInHalf(byte[] output)
7878

7979
public void skUnpack(byte[] input)
8080
{
81-
byte[] tmp = new byte[input.length << 1];
81+
byte[] tmp = new byte[(input.length - SnovaKeyPairGenerator.publicSeedLength - SnovaKeyPairGenerator.privateSeedLength)<< 1];
8282
GF16Utils.decodeMergeInHalf(input, tmp, tmp.length);
8383
int inOff = 0;
8484
inOff = copy3d(tmp, inOff, map1.aAlpha);
@@ -89,10 +89,9 @@ public void skUnpack(byte[] input)
8989
inOff = copy4d(tmp, inOff, map2.f11);
9090
inOff = copy4d(tmp, inOff, map2.f12);
9191
inOff = copy4d(tmp, inOff, map2.f21);
92-
System.arraycopy(tmp, inOff, publicKey.publicKeySeed, 0, publicKey.publicKeySeed.length);
93-
inOff += publicKey.publicKeySeed.length;
92+
System.arraycopy(input, input.length - SnovaKeyPairGenerator.publicSeedLength - SnovaKeyPairGenerator.privateSeedLength, publicKey.publicKeySeed, 0, publicKey.publicKeySeed.length);
9493
ptPrivateKeySeed = new byte[SnovaKeyPairGenerator.privateSeedLength];
95-
System.arraycopy(tmp, inOff, ptPrivateKeySeed, 0, ptPrivateKeySeed.length);
94+
System.arraycopy(input, input.length - SnovaKeyPairGenerator.privateSeedLength, ptPrivateKeySeed, 0, ptPrivateKeySeed.length);
9695
}
9796

9897
public int copy3d(byte[][][] alpha, byte[] output, int outOff)
@@ -134,7 +133,14 @@ public int copy4d(byte[] input, int inOff, byte[][][][] alpha)
134133
{
135134
for (int i = 0; i < alpha.length; ++i)
136135
{
137-
inOff = copy3d(alpha[i], input, inOff);
136+
for (int j = 0; j < alpha[i].length; ++j)
137+
{
138+
for (int k = 0; k < alpha[i][j].length; ++k)
139+
{
140+
System.arraycopy(input, inOff, alpha[i][j][k], 0, alpha[i][j][k].length);
141+
inOff += alpha[i][j][k].length;
142+
}
143+
}
138144
}
139145
return inOff;
140146
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,9 @@ public int getLsq()
187187
{
188188
return l * l;
189189
}
190+
191+
public int getSaltLength()
192+
{
193+
return 16;
194+
}
190195
}

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

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@
44
import java.util.Arrays;
55

66
import org.bouncycastle.crypto.CipherParameters;
7-
import org.bouncycastle.crypto.CryptoException;
87
import org.bouncycastle.crypto.CryptoServicesRegistrar;
9-
import org.bouncycastle.crypto.DataLengthException;
10-
import org.bouncycastle.crypto.Signer;
118
import org.bouncycastle.crypto.digests.SHAKEDigest;
129
import org.bouncycastle.crypto.params.ParametersWithRandom;
10+
import org.bouncycastle.pqc.crypto.MessageSigner;
1311

1412
public class SnovaSigner
15-
implements Signer
13+
implements MessageSigner
1614
{
1715
private SnovaParameters params;
1816
private SnovaEngine engine;
@@ -53,25 +51,14 @@ public void init(boolean forSigning, CipherParameters param)
5351
}
5452

5553
@Override
56-
public void update(byte b)
57-
{
58-
digest.update(b);
59-
}
60-
61-
@Override
62-
public void update(byte[] in, int off, int len)
63-
{
64-
digest.update(in, off, len);
65-
}
66-
67-
@Override
68-
public byte[] generateSignature()
69-
throws CryptoException, DataLengthException
54+
public byte[] generateSignature(byte[] message)
7055
{
7156
byte[] hash = new byte[digest.getDigestSize()];
57+
digest.update(message, 0, message.length);
7258
digest.doFinal(hash, 0);
73-
byte[] salt = new byte[16];
59+
byte[] salt = new byte[params.getSaltLength()];
7460
random.nextBytes(salt);
61+
byte[] signature = new byte[((params.getN() * params.getLsq() + 1) >>> 1) + params.getSaltLength()];
7562
if (params.isSkIsSeed())
7663
{
7764

@@ -80,22 +67,18 @@ public byte[] generateSignature()
8067
{
8168
SnovaKeyElements esk = new SnovaKeyElements(params, engine);
8269
esk.skUnpack(privKey.getPrivateKey());
70+
signDigestCore(signature, hash, salt, esk.map1.aAlpha, esk.map1.bAlpha, esk.map1.qAlpha1, esk.map1.qAlpha2,
71+
esk.T12, esk.map2.f11, esk.map2.f12, esk.map2.f21, esk.publicKey.publicKeySeed, esk.ptPrivateKeySeed);
8372
}
8473
return new byte[0];
8574
}
8675

8776
@Override
88-
public boolean verifySignature(byte[] signature)
77+
public boolean verifySignature(byte[] message, byte[] signature)
8978
{
9079
return false;
9180
}
9281

93-
@Override
94-
public void reset()
95-
{
96-
97-
}
98-
9982
public static void createSignedHash(
10083
byte[] digest, int bytesDigest,
10184
byte[] ptPublicKeySeed, int seedLengthPublic,
@@ -120,9 +103,9 @@ public static void createSignedHash(
120103
}
121104

122105
public void signDigestCore(byte[] ptSignature, byte[] digest, byte[] arraySalt,
123-
byte[][][][] Aalpha, byte[][][][] Balpha,
124-
byte[][][][] Qalpha1, byte[][][][] Qalpha2,
125-
byte[][][][] T12, byte[][][][] F11,
106+
byte[][][] Aalpha, byte[][][] Balpha,
107+
byte[][][] Qalpha1, byte[][][] Qalpha2,
108+
byte[][][] T12, byte[][][][] F11,
126109
byte[][][][] F12, byte[][][][] F21,
127110
byte[] ptPublicKeySeed, byte[] ptPrivateKeySeed)
128111
{
@@ -168,7 +151,10 @@ public void signDigestCore(byte[] ptSignature, byte[] digest, byte[] arraySalt,
168151
do
169152
{
170153
// Initialize Gauss matrix
171-
Arrays.stream(Gauss).forEach(row -> Arrays.fill(row, (byte)0));
154+
for (int i = 0; i < Gauss.length; ++i)
155+
{
156+
Arrays.fill(Gauss[i], (byte)0);
157+
}
172158
numSign++;
173159
//flagRedo = 0;
174160

@@ -357,6 +343,26 @@ private void multiplyGF16Matrices(byte[][] a, byte[] b, byte[][] result)
357343
}
358344
}
359345

346+
private void multiplyGF16Matrices(byte[] a, byte[][] b, byte[][] result)
347+
{
348+
for (int i = 0; i < params.getL(); i++)
349+
{
350+
Arrays.fill(result[i], (byte)0);
351+
for (int j = 0; j < params.getL(); j++)
352+
{
353+
byte sum = 0;
354+
for (int k = 0; k < params.getL(); k++)
355+
{
356+
sum = GF16Utils.add(sum, GF16Utils.mul(
357+
engine.getGF16m(a, i, k),
358+
b[k][j]
359+
));
360+
}
361+
result[i][j] = sum;
362+
}
363+
}
364+
}
365+
360366
private int performGaussianElimination(byte[][] Gauss, byte[] solution, int size)
361367
{
362368
final int cols = size + 1;

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

Lines changed: 74 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -28,42 +28,42 @@ public static void main(String[] args)
2828

2929
private static final SnovaParameters[] PARAMETER_SETS = new SnovaParameters[]
3030
{
31-
// SnovaParameters.SNOVA_24_5_16_4_ESK,
32-
// SnovaParameters.SNOVA_24_5_16_4_SHAKE_ESK,
33-
// SnovaParameters.SNOVA_24_5_16_4_SHAKE_SSK,
34-
// SnovaParameters.SNOVA_24_5_16_4_SSK,
35-
// SnovaParameters.SNOVA_24_5_16_5_ESK,
36-
// SnovaParameters.SNOVA_24_5_16_5_SHAKE_ESK,
37-
// SnovaParameters.SNOVA_24_5_16_5_SHAKE_SSK,
38-
// SnovaParameters.SNOVA_24_5_16_5_SSK,
39-
// SnovaParameters.SNOVA_25_8_16_3_ESK,
40-
// SnovaParameters.SNOVA_25_8_16_3_SHAKE_ESK,
41-
// SnovaParameters.SNOVA_25_8_16_3_SHAKE_SSK,
42-
// SnovaParameters.SNOVA_25_8_16_3_SSK,
43-
// SnovaParameters.SNOVA_29_6_16_5_ESK,
44-
// SnovaParameters.SNOVA_29_6_16_5_SHAKE_ESK,
45-
// SnovaParameters.SNOVA_29_6_16_5_SHAKE_SSK,
46-
// SnovaParameters.SNOVA_29_6_16_5_SSK,
47-
// SnovaParameters.SNOVA_37_8_16_4_ESK,
48-
// SnovaParameters.SNOVA_37_8_16_4_SHAKE_ESK,
49-
// SnovaParameters.SNOVA_37_8_16_4_SHAKE_SSK,
50-
// SnovaParameters.SNOVA_37_8_16_4_SSK,
51-
// SnovaParameters.SNOVA_37_17_16_2_ESK,
52-
// SnovaParameters.SNOVA_37_17_16_2_SHAKE_ESK,
53-
// SnovaParameters.SNOVA_37_17_16_2_SHAKE_SSK,
54-
// SnovaParameters.SNOVA_37_17_16_2_SSK,
55-
// SnovaParameters.SNOVA_49_11_16_3_ESK,
56-
// SnovaParameters.SNOVA_49_11_16_3_SHAKE_ESK,
57-
// SnovaParameters.SNOVA_49_11_16_3_SHAKE_SSK,
58-
// SnovaParameters.SNOVA_49_11_16_3_SSK,
59-
// SnovaParameters.SNOVA_56_25_16_2_ESK,
60-
// SnovaParameters.SNOVA_56_25_16_2_SHAKE_ESK,
61-
// SnovaParameters.SNOVA_56_25_16_2_SHAKE_SSK,
62-
// SnovaParameters.SNOVA_56_25_16_2_SSK,
63-
// SnovaParameters.SNOVA_60_10_16_4_ESK,
64-
// SnovaParameters.SNOVA_60_10_16_4_SHAKE_ESK,
65-
// SnovaParameters.SNOVA_60_10_16_4_SHAKE_SSK,
66-
// SnovaParameters.SNOVA_60_10_16_4_SSK,
31+
SnovaParameters.SNOVA_24_5_16_4_ESK,
32+
SnovaParameters.SNOVA_24_5_16_4_SHAKE_ESK,
33+
SnovaParameters.SNOVA_24_5_16_4_SHAKE_SSK,
34+
SnovaParameters.SNOVA_24_5_16_4_SSK,
35+
SnovaParameters.SNOVA_24_5_16_5_ESK,
36+
SnovaParameters.SNOVA_24_5_16_5_SHAKE_ESK,
37+
SnovaParameters.SNOVA_24_5_16_5_SHAKE_SSK,
38+
SnovaParameters.SNOVA_24_5_16_5_SSK,
39+
SnovaParameters.SNOVA_25_8_16_3_ESK,
40+
SnovaParameters.SNOVA_25_8_16_3_SHAKE_ESK,
41+
SnovaParameters.SNOVA_25_8_16_3_SHAKE_SSK,
42+
SnovaParameters.SNOVA_25_8_16_3_SSK,
43+
SnovaParameters.SNOVA_29_6_16_5_ESK,
44+
SnovaParameters.SNOVA_29_6_16_5_SHAKE_ESK,
45+
SnovaParameters.SNOVA_29_6_16_5_SHAKE_SSK,
46+
SnovaParameters.SNOVA_29_6_16_5_SSK,
47+
SnovaParameters.SNOVA_37_8_16_4_ESK,
48+
SnovaParameters.SNOVA_37_8_16_4_SHAKE_ESK,
49+
SnovaParameters.SNOVA_37_8_16_4_SHAKE_SSK,
50+
SnovaParameters.SNOVA_37_8_16_4_SSK,
51+
SnovaParameters.SNOVA_37_17_16_2_ESK,
52+
SnovaParameters.SNOVA_37_17_16_2_SHAKE_ESK,
53+
SnovaParameters.SNOVA_37_17_16_2_SHAKE_SSK,
54+
SnovaParameters.SNOVA_37_17_16_2_SSK,
55+
SnovaParameters.SNOVA_49_11_16_3_ESK,
56+
SnovaParameters.SNOVA_49_11_16_3_SHAKE_ESK,
57+
SnovaParameters.SNOVA_49_11_16_3_SHAKE_SSK,
58+
SnovaParameters.SNOVA_49_11_16_3_SSK,
59+
SnovaParameters.SNOVA_56_25_16_2_ESK,
60+
SnovaParameters.SNOVA_56_25_16_2_SHAKE_ESK,
61+
SnovaParameters.SNOVA_56_25_16_2_SHAKE_SSK,
62+
SnovaParameters.SNOVA_56_25_16_2_SSK,
63+
SnovaParameters.SNOVA_60_10_16_4_ESK,
64+
SnovaParameters.SNOVA_60_10_16_4_SHAKE_ESK,
65+
SnovaParameters.SNOVA_60_10_16_4_SHAKE_SSK,
66+
SnovaParameters.SNOVA_60_10_16_4_SSK,
6767
SnovaParameters.SNOVA_66_15_16_3_ESK,
6868
SnovaParameters.SNOVA_66_15_16_3_SHAKE_ESK,
6969
SnovaParameters.SNOVA_66_15_16_3_SHAKE_SSK,
@@ -75,42 +75,42 @@ public static void main(String[] args)
7575
};
7676

7777
private static final String[] files = new String[]{
78-
// "PQCsignKAT_SNOVA_24_5_4_ESK.rsp",
79-
// "PQCsignKAT_SNOVA_24_5_4_SHAKE_ESK.rsp",
80-
// "PQCsignKAT_SNOVA_24_5_4_SHAKE_SSK.rsp",
81-
// "PQCsignKAT_SNOVA_24_5_4_SSK.rsp",
82-
// "PQCsignKAT_SNOVA_24_5_5_ESK.rsp",
83-
// "PQCsignKAT_SNOVA_24_5_5_SHAKE_ESK.rsp",
84-
// "PQCsignKAT_SNOVA_24_5_5_SHAKE_SSK.rsp",
85-
// "PQCsignKAT_SNOVA_24_5_5_SSK.rsp",
86-
// "PQCsignKAT_SNOVA_25_8_3_ESK.rsp",
87-
// "PQCsignKAT_SNOVA_25_8_3_SHAKE_ESK.rsp",
88-
// "PQCsignKAT_SNOVA_25_8_3_SHAKE_SSK.rsp",
89-
// "PQCsignKAT_SNOVA_25_8_3_SSK.rsp",
90-
// "PQCsignKAT_SNOVA_29_6_5_ESK.rsp",
91-
// "PQCsignKAT_SNOVA_29_6_5_SHAKE_ESK.rsp",
92-
// "PQCsignKAT_SNOVA_29_6_5_SHAKE_SSK.rsp",
93-
// "PQCsignKAT_SNOVA_29_6_5_SSK.rsp",
94-
// "PQCsignKAT_SNOVA_37_8_4_ESK.rsp",
95-
// "PQCsignKAT_SNOVA_37_8_4_SHAKE_ESK.rsp",
96-
// "PQCsignKAT_SNOVA_37_8_4_SHAKE_SSK.rsp",
97-
// "PQCsignKAT_SNOVA_37_8_4_SSK.rsp",
98-
// "PQCsignKAT_SNOVA_37_17_2_ESK.rsp",
99-
// "PQCsignKAT_SNOVA_37_17_2_SHAKE_ESK.rsp",
100-
// "PQCsignKAT_SNOVA_37_17_2_SHAKE_SSK.rsp",
101-
// "PQCsignKAT_SNOVA_37_17_2_SSK.rsp",
102-
// "PQCsignKAT_SNOVA_49_11_3_ESK.rsp",
103-
// "PQCsignKAT_SNOVA_49_11_3_SHAKE_ESK.rsp",
104-
// "PQCsignKAT_SNOVA_49_11_3_SHAKE_SSK.rsp",
105-
// "PQCsignKAT_SNOVA_49_11_3_SSK.rsp",
106-
// "PQCsignKAT_SNOVA_56_25_2_ESK.rsp",
107-
// "PQCsignKAT_SNOVA_56_25_2_SHAKE_ESK.rsp",
108-
// "PQCsignKAT_SNOVA_56_25_2_SHAKE_SSK.rsp",
109-
// "PQCsignKAT_SNOVA_56_25_2_SSK.rsp",
110-
// "PQCsignKAT_SNOVA_60_10_4_ESK.rsp",
111-
// "PQCsignKAT_SNOVA_60_10_4_SHAKE_ESK.rsp",
112-
// "PQCsignKAT_SNOVA_60_10_4_SHAKE_SSK.rsp",
113-
// "PQCsignKAT_SNOVA_60_10_4_SSK.rsp",
78+
"PQCsignKAT_SNOVA_24_5_4_ESK.rsp",
79+
"PQCsignKAT_SNOVA_24_5_4_SHAKE_ESK.rsp",
80+
"PQCsignKAT_SNOVA_24_5_4_SHAKE_SSK.rsp",
81+
"PQCsignKAT_SNOVA_24_5_4_SSK.rsp",
82+
"PQCsignKAT_SNOVA_24_5_5_ESK.rsp",
83+
"PQCsignKAT_SNOVA_24_5_5_SHAKE_ESK.rsp",
84+
"PQCsignKAT_SNOVA_24_5_5_SHAKE_SSK.rsp",
85+
"PQCsignKAT_SNOVA_24_5_5_SSK.rsp",
86+
"PQCsignKAT_SNOVA_25_8_3_ESK.rsp",
87+
"PQCsignKAT_SNOVA_25_8_3_SHAKE_ESK.rsp",
88+
"PQCsignKAT_SNOVA_25_8_3_SHAKE_SSK.rsp",
89+
"PQCsignKAT_SNOVA_25_8_3_SSK.rsp",
90+
"PQCsignKAT_SNOVA_29_6_5_ESK.rsp",
91+
"PQCsignKAT_SNOVA_29_6_5_SHAKE_ESK.rsp",
92+
"PQCsignKAT_SNOVA_29_6_5_SHAKE_SSK.rsp",
93+
"PQCsignKAT_SNOVA_29_6_5_SSK.rsp",
94+
"PQCsignKAT_SNOVA_37_8_4_ESK.rsp",
95+
"PQCsignKAT_SNOVA_37_8_4_SHAKE_ESK.rsp",
96+
"PQCsignKAT_SNOVA_37_8_4_SHAKE_SSK.rsp",
97+
"PQCsignKAT_SNOVA_37_8_4_SSK.rsp",
98+
"PQCsignKAT_SNOVA_37_17_2_ESK.rsp",
99+
"PQCsignKAT_SNOVA_37_17_2_SHAKE_ESK.rsp",
100+
"PQCsignKAT_SNOVA_37_17_2_SHAKE_SSK.rsp",
101+
"PQCsignKAT_SNOVA_37_17_2_SSK.rsp",
102+
"PQCsignKAT_SNOVA_49_11_3_ESK.rsp",
103+
"PQCsignKAT_SNOVA_49_11_3_SHAKE_ESK.rsp",
104+
"PQCsignKAT_SNOVA_49_11_3_SHAKE_SSK.rsp",
105+
"PQCsignKAT_SNOVA_49_11_3_SSK.rsp",
106+
"PQCsignKAT_SNOVA_56_25_2_ESK.rsp",
107+
"PQCsignKAT_SNOVA_56_25_2_SHAKE_ESK.rsp",
108+
"PQCsignKAT_SNOVA_56_25_2_SHAKE_SSK.rsp",
109+
"PQCsignKAT_SNOVA_56_25_2_SSK.rsp",
110+
"PQCsignKAT_SNOVA_60_10_4_ESK.rsp",
111+
"PQCsignKAT_SNOVA_60_10_4_SHAKE_ESK.rsp",
112+
"PQCsignKAT_SNOVA_60_10_4_SHAKE_SSK.rsp",
113+
"PQCsignKAT_SNOVA_60_10_4_SSK.rsp",
114114
"PQCsignKAT_SNOVA_66_15_3_ESK.rsp",
115115
"PQCsignKAT_SNOVA_66_15_3_SHAKE_ESK.rsp",
116116
"PQCsignKAT_SNOVA_66_15_3_SHAKE_SSK.rsp",
@@ -159,13 +159,13 @@ public byte[] getPrivateKeyEncoded(CipherParameters privParams)
159159
@Override
160160
public Signer getSigner()
161161
{
162-
return new SnovaSigner();
162+
return null;
163163
}
164164

165165
@Override
166166
public MessageSigner getMessageSigner()
167167
{
168-
return null;//new SnovaSigner();
168+
return new SnovaSigner();
169169
}
170170
});
171171
long end = System.currentTimeMillis();

0 commit comments

Comments
 (0)