Skip to content

Commit 1b1a40f

Browse files
author
gefeili
committed
Add SnovaTest to jcajce.provider.test
1 parent f82ae92 commit 1b1a40f

File tree

2 files changed

+319
-0
lines changed

2 files changed

+319
-0
lines changed

prov/src/test/java/org/bouncycastle/pqc/jcajce/provider/test/AllTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ public static Test suite()
7979
suite.addTestSuite(RainbowTest.class);
8080
suite.addTestSuite(MayoKeyPairGeneratorTest.class);
8181
suite.addTestSuite(MayoTest.class);
82+
suite.addTestSuite(SnovaTest.class);
8283

8384
return new BCTestSetup(suite);
8485
}
Lines changed: 318 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,318 @@
1+
package org.bouncycastle.pqc.jcajce.provider.test;
2+
3+
import java.io.ByteArrayInputStream;
4+
import java.io.ByteArrayOutputStream;
5+
import java.io.ObjectInputStream;
6+
import java.io.ObjectOutputStream;
7+
import java.security.InvalidKeyException;
8+
import java.security.KeyFactory;
9+
import java.security.KeyPair;
10+
import java.security.KeyPairGenerator;
11+
import java.security.SecureRandom;
12+
import java.security.Security;
13+
import java.security.Signature;
14+
import java.security.spec.PKCS8EncodedKeySpec;
15+
import java.security.spec.X509EncodedKeySpec;
16+
17+
import junit.framework.TestCase;
18+
import org.bouncycastle.pqc.jcajce.interfaces.SnovaKey;
19+
import org.bouncycastle.pqc.jcajce.provider.BouncyCastlePQCProvider;
20+
import org.bouncycastle.pqc.jcajce.spec.SnovaParameterSpec;
21+
import org.bouncycastle.util.Strings;
22+
23+
public class SnovaTest
24+
extends TestCase
25+
{
26+
public static void main(String[] args)
27+
throws Exception
28+
{
29+
SnovaTest test = new SnovaTest();
30+
test.setUp();
31+
test.testPrivateKeyRecovery();
32+
test.testPublicKeyRecovery();
33+
test.testRestrictedKeyPairGen();
34+
test.testSnovaRandomSig();
35+
test.testSnovaSign();
36+
}
37+
38+
byte[] msg = Strings.toByteArray("Hello World!");
39+
40+
public void setUp()
41+
{
42+
if (Security.getProvider(BouncyCastlePQCProvider.PROVIDER_NAME) == null)
43+
{
44+
Security.addProvider(new BouncyCastlePQCProvider());
45+
}
46+
}
47+
48+
public void testPrivateKeyRecovery()
49+
throws Exception
50+
{
51+
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Snova", "BCPQC");
52+
53+
kpg.initialize(SnovaParameterSpec.SNOVA_24_5_4_ESK, new RiggedRandom());
54+
55+
KeyPair kp = kpg.generateKeyPair();
56+
57+
KeyFactory kFact = KeyFactory.getInstance("Snova", "BCPQC");
58+
59+
SnovaKey privKey = (SnovaKey)kFact.generatePrivate(new PKCS8EncodedKeySpec(kp.getPrivate().getEncoded()));
60+
61+
assertEquals(kp.getPrivate(), privKey);
62+
assertEquals(kp.getPrivate().getAlgorithm(), privKey.getAlgorithm());
63+
assertEquals(kp.getPrivate().hashCode(), privKey.hashCode());
64+
65+
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
66+
ObjectOutputStream oOut = new ObjectOutputStream(bOut);
67+
68+
oOut.writeObject(privKey);
69+
70+
oOut.close();
71+
72+
ObjectInputStream oIn = new ObjectInputStream(new ByteArrayInputStream(bOut.toByteArray()));
73+
74+
SnovaKey privKey2 = (SnovaKey)oIn.readObject();
75+
76+
assertEquals(privKey, privKey2);
77+
assertEquals(privKey.getAlgorithm(), privKey2.getAlgorithm());
78+
assertEquals(privKey.hashCode(), privKey2.hashCode());
79+
}
80+
81+
public void testPublicKeyRecovery()
82+
throws Exception
83+
{
84+
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Snova", "BCPQC");
85+
86+
kpg.initialize(SnovaParameterSpec.SNOVA_25_8_3_ESK, new SnovaTest.RiggedRandom());
87+
88+
KeyPair kp = kpg.generateKeyPair();
89+
90+
KeyFactory kFact = KeyFactory.getInstance(SnovaParameterSpec.SNOVA_25_8_3_ESK.getName(), "BCPQC");
91+
92+
SnovaKey pubKey = (SnovaKey)kFact.generatePublic(new X509EncodedKeySpec(kp.getPublic().getEncoded()));
93+
94+
assertEquals(kp.getPublic(), pubKey);
95+
assertEquals(kp.getPublic().getAlgorithm(), pubKey.getAlgorithm());
96+
assertEquals(kp.getPublic().hashCode(), pubKey.hashCode());
97+
98+
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
99+
ObjectOutputStream oOut = new ObjectOutputStream(bOut);
100+
101+
oOut.writeObject(pubKey);
102+
103+
oOut.close();
104+
105+
ObjectInputStream oIn = new ObjectInputStream(new ByteArrayInputStream(bOut.toByteArray()));
106+
107+
SnovaKey pubKey2 = (SnovaKey)oIn.readObject();
108+
109+
assertEquals(pubKey, pubKey2);
110+
assertEquals(pubKey.getAlgorithm(), pubKey2.getAlgorithm());
111+
assertEquals(pubKey.hashCode(), pubKey2.hashCode());
112+
}
113+
114+
public void testSnovaSign()
115+
throws Exception
116+
{
117+
testSnova(SnovaParameterSpec.SNOVA_24_5_4_ESK, SnovaParameterSpec.SNOVA_24_5_4_SSK);
118+
testSnova(SnovaParameterSpec.SNOVA_24_5_4_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
119+
testSnova(SnovaParameterSpec.SNOVA_24_5_4_SHAKE_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
120+
testSnova(SnovaParameterSpec.SNOVA_24_5_4_SHAKE_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
121+
testSnova(SnovaParameterSpec.SNOVA_24_5_5_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
122+
testSnova(SnovaParameterSpec.SNOVA_24_5_5_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
123+
testSnova(SnovaParameterSpec.SNOVA_24_5_5_SHAKE_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
124+
testSnova(SnovaParameterSpec.SNOVA_24_5_5_SHAKE_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
125+
testSnova(SnovaParameterSpec.SNOVA_25_8_3_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
126+
testSnova(SnovaParameterSpec.SNOVA_25_8_3_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
127+
testSnova(SnovaParameterSpec.SNOVA_25_8_3_SHAKE_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
128+
testSnova(SnovaParameterSpec.SNOVA_25_8_3_SHAKE_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
129+
testSnova(SnovaParameterSpec.SNOVA_29_6_5_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
130+
testSnova(SnovaParameterSpec.SNOVA_29_6_5_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
131+
testSnova(SnovaParameterSpec.SNOVA_29_6_5_SHAKE_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
132+
testSnova(SnovaParameterSpec.SNOVA_29_6_5_SHAKE_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
133+
testSnova(SnovaParameterSpec.SNOVA_37_8_4_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
134+
testSnova(SnovaParameterSpec.SNOVA_37_8_4_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
135+
testSnova(SnovaParameterSpec.SNOVA_37_8_4_SHAKE_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
136+
testSnova(SnovaParameterSpec.SNOVA_37_8_4_SHAKE_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
137+
testSnova(SnovaParameterSpec.SNOVA_37_17_2_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
138+
testSnova(SnovaParameterSpec.SNOVA_37_17_2_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
139+
testSnova(SnovaParameterSpec.SNOVA_37_17_2_SHAKE_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
140+
testSnova(SnovaParameterSpec.SNOVA_37_17_2_SHAKE_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
141+
testSnova(SnovaParameterSpec.SNOVA_49_11_3_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
142+
testSnova(SnovaParameterSpec.SNOVA_49_11_3_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
143+
testSnova(SnovaParameterSpec.SNOVA_49_11_3_SHAKE_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
144+
testSnova(SnovaParameterSpec.SNOVA_49_11_3_SHAKE_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
145+
testSnova(SnovaParameterSpec.SNOVA_56_25_2_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
146+
testSnova(SnovaParameterSpec.SNOVA_56_25_2_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
147+
testSnova(SnovaParameterSpec.SNOVA_56_25_2_SHAKE_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
148+
testSnova(SnovaParameterSpec.SNOVA_56_25_2_SHAKE_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
149+
testSnova(SnovaParameterSpec.SNOVA_60_10_4_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
150+
testSnova(SnovaParameterSpec.SNOVA_60_10_4_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
151+
testSnova(SnovaParameterSpec.SNOVA_60_10_4_SHAKE_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
152+
testSnova(SnovaParameterSpec.SNOVA_60_10_4_SHAKE_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
153+
testSnova(SnovaParameterSpec.SNOVA_66_15_3_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
154+
testSnova(SnovaParameterSpec.SNOVA_66_15_3_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
155+
testSnova(SnovaParameterSpec.SNOVA_66_15_3_SHAKE_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
156+
testSnova(SnovaParameterSpec.SNOVA_66_15_3_SHAKE_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
157+
testSnova(SnovaParameterSpec.SNOVA_75_33_2_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
158+
testSnova(SnovaParameterSpec.SNOVA_75_33_2_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
159+
testSnova(SnovaParameterSpec.SNOVA_75_33_2_SHAKE_ESK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
160+
testSnova(SnovaParameterSpec.SNOVA_75_33_2_SHAKE_SSK, SnovaParameterSpec.SNOVA_24_5_4_ESK);
161+
}
162+
163+
private void testSnova(SnovaParameterSpec spec, SnovaParameterSpec wrongSpec)
164+
throws Exception
165+
{
166+
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Snova", "BCPQC");
167+
168+
kpg.initialize(spec, new SecureRandom());
169+
170+
KeyPair kp = kpg.generateKeyPair();
171+
172+
Signature sig = Signature.getInstance(spec.getName(), "BCPQC");
173+
174+
sig.initSign(kp.getPrivate(), new SecureRandom());
175+
176+
sig.update(msg, 0, msg.length);
177+
178+
byte[] s = sig.sign();
179+
180+
sig = Signature.getInstance(spec.getName(), "BCPQC");
181+
182+
assertEquals(spec.getName(), Strings.toUpperCase(sig.getAlgorithm()));
183+
184+
sig.initVerify(kp.getPublic());
185+
186+
sig.update(msg, 0, msg.length);
187+
188+
assertTrue(sig.verify(s));
189+
190+
kpg = KeyPairGenerator.getInstance("Snova", "BCPQC");
191+
192+
kpg.initialize(wrongSpec, new SecureRandom());
193+
194+
kp = kpg.generateKeyPair();
195+
196+
try
197+
{
198+
sig.initVerify(kp.getPublic());
199+
fail("no exception");
200+
}
201+
catch (InvalidKeyException e)
202+
{
203+
assertEquals("signature configured for " + spec.getName(), e.getMessage());
204+
}
205+
}
206+
207+
public void testRestrictedKeyPairGen()
208+
throws Exception
209+
{
210+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_24_5_4_ESK);
211+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_24_5_4_SSK);
212+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_24_5_4_SHAKE_ESK);
213+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_24_5_4_SHAKE_SSK);
214+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_24_5_5_ESK);
215+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_24_5_5_SSK);
216+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_24_5_5_SHAKE_ESK);
217+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_24_5_5_SHAKE_SSK);
218+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_25_8_3_ESK);
219+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_25_8_3_SSK);
220+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_25_8_3_SHAKE_ESK);
221+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_25_8_3_SHAKE_SSK);
222+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_29_6_5_ESK);
223+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_29_6_5_SSK);
224+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_29_6_5_SHAKE_ESK);
225+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_29_6_5_SHAKE_SSK);
226+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_37_8_4_ESK);
227+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_37_8_4_SSK);
228+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_37_8_4_SHAKE_ESK);
229+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_37_8_4_SHAKE_SSK);
230+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_37_17_2_ESK);
231+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_37_17_2_SSK);
232+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_37_17_2_SHAKE_ESK);
233+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_37_17_2_SHAKE_SSK);
234+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_49_11_3_ESK);
235+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_49_11_3_SSK);
236+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_49_11_3_SHAKE_ESK);
237+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_49_11_3_SHAKE_SSK);
238+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_56_25_2_ESK);
239+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_56_25_2_SSK);
240+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_56_25_2_SHAKE_ESK);
241+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_56_25_2_SHAKE_SSK);
242+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_60_10_4_ESK);
243+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_60_10_4_SSK);
244+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_60_10_4_SHAKE_ESK);
245+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_60_10_4_SHAKE_SSK);
246+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_66_15_3_ESK);
247+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_66_15_3_SSK);
248+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_66_15_3_SHAKE_ESK);
249+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_66_15_3_SHAKE_SSK);
250+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_75_33_2_ESK);
251+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_75_33_2_SSK);
252+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_75_33_2_SHAKE_ESK);
253+
doTestRestrictedKeyPairGen(SnovaParameterSpec.SNOVA_75_33_2_SHAKE_SSK);
254+
}
255+
256+
private void doTestRestrictedKeyPairGen(SnovaParameterSpec spec)
257+
throws Exception
258+
{
259+
KeyPairGenerator kpg = KeyPairGenerator.getInstance(spec.getName(), "BCPQC");
260+
261+
kpg.initialize(spec, new SecureRandom());
262+
263+
KeyPair kp = kpg.generateKeyPair();
264+
265+
assertEquals(spec.getName(), kp.getPublic().getAlgorithm());
266+
assertEquals(spec.getName(), kp.getPrivate().getAlgorithm());
267+
268+
//kpg = KeyPairGenerator.getInstance(spec.getName(), "BCPQC");
269+
270+
// try
271+
// {
272+
// kpg.initialize(altSpec, new SecureRandom());
273+
// fail("no exception");
274+
// }
275+
// catch (InvalidAlgorithmParameterException e)
276+
// {
277+
// assertEquals("key pair generator locked to " + spec.getName(), e.getMessage());
278+
// }
279+
}
280+
281+
public void testSnovaRandomSig()
282+
throws Exception
283+
{
284+
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Snova", "BCPQC");
285+
286+
kpg.initialize(SnovaParameterSpec.SNOVA_24_5_5_SHAKE_SSK, new SecureRandom());
287+
288+
KeyPair kp = kpg.generateKeyPair();
289+
290+
Signature sig = Signature.getInstance("Snova", "BCPQC");
291+
292+
sig.initSign(kp.getPrivate(), new SecureRandom());
293+
294+
sig.update(msg, 0, msg.length);
295+
296+
byte[] s = sig.sign();
297+
298+
sig = Signature.getInstance("Snova", "BCPQC");
299+
300+
sig.initVerify(kp.getPublic());
301+
302+
sig.update(msg, 0, msg.length);
303+
304+
assertTrue(sig.verify(s));
305+
}
306+
307+
private static class RiggedRandom
308+
extends SecureRandom
309+
{
310+
public void nextBytes(byte[] bytes)
311+
{
312+
for (int i = 0; i != bytes.length; i++)
313+
{
314+
bytes[i] = (byte)(i & 0xff);
315+
}
316+
}
317+
}
318+
}

0 commit comments

Comments
 (0)