Skip to content

Commit fa764c6

Browse files
committed
corrected mixed casing issues in spec look up.
1 parent 77022c5 commit fa764c6

File tree

6 files changed

+178
-30
lines changed

6 files changed

+178
-30
lines changed

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/mldsa/MLDSAKeyPairGeneratorSpi.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
1212
import org.bouncycastle.crypto.CryptoServicesRegistrar;
1313
import org.bouncycastle.jcajce.spec.MLDSAParameterSpec;
14+
import org.bouncycastle.jcajce.util.BCJcaJceHelper;
1415
import org.bouncycastle.pqc.crypto.mldsa.MLDSAKeyGenerationParameters;
1516
import org.bouncycastle.pqc.crypto.mldsa.MLDSAKeyPairGenerator;
1617
import org.bouncycastle.pqc.crypto.mldsa.MLDSAParameters;
@@ -68,18 +69,35 @@ public void initialize(
6869
throw new IllegalArgumentException("use AlgorithmParameterSpec");
6970
}
7071

72+
public void initialize(
73+
AlgorithmParameterSpec params)
74+
throws InvalidAlgorithmParameterException
75+
{
76+
try
77+
{
78+
initialize(params, new BCJcaJceHelper().createSecureRandom("DEFAULT"));
79+
}
80+
catch (NoSuchAlgorithmException e)
81+
{
82+
throw new IllegalStateException("unable to find DEFAULT DRBG");
83+
}
84+
}
85+
7186
public void initialize(
7287
AlgorithmParameterSpec params,
7388
SecureRandom random)
7489
throws InvalidAlgorithmParameterException
7590
{
7691
String name = getNameFromParams(params);
7792

78-
if (name != null && parameters.containsKey(name))
93+
if (name != null)
7994
{
8095
MLDSAParameters mldsaParams = (MLDSAParameters)parameters.get(name);
81-
82-
param = new MLDSAKeyGenerationParameters(random, (MLDSAParameters)parameters.get(name));
96+
if (mldsaParams == null)
97+
{
98+
throw new InvalidAlgorithmParameterException("unknown parameter set name: " + name);
99+
}
100+
param = new MLDSAKeyGenerationParameters(random, mldsaParams);
83101

84102
if (mldsaParameters != null && !mldsaParams.getName().equals(mldsaParameters.getName()))
85103
{
@@ -124,11 +142,11 @@ private static String getNameFromParams(AlgorithmParameterSpec paramSpec)
124142
if (paramSpec instanceof MLDSAParameterSpec)
125143
{
126144
MLDSAParameterSpec params = (MLDSAParameterSpec)paramSpec;
127-
return Strings.toLowerCase(params.getName());
145+
return params.getName();
128146
}
129147
else
130148
{
131-
return Strings.toLowerCase(SpecUtil.getNameFrom(paramSpec));
149+
return Strings.toUpperCase(SpecUtil.getNameFrom(paramSpec));
132150
}
133151
}
134152

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/mlkem/MLKEMKeyPairGeneratorSpi.java

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.security.InvalidAlgorithmParameterException;
44
import java.security.KeyPair;
5+
import java.security.NoSuchAlgorithmException;
56
import java.security.SecureRandom;
67
import java.security.spec.AlgorithmParameterSpec;
78
import java.util.HashMap;
@@ -10,6 +11,7 @@
1011
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
1112
import org.bouncycastle.crypto.CryptoServicesRegistrar;
1213
import org.bouncycastle.jcajce.spec.MLKEMParameterSpec;
14+
import org.bouncycastle.jcajce.util.BCJcaJceHelper;
1315
import org.bouncycastle.pqc.crypto.mlkem.MLKEMKeyGenerationParameters;
1416
import org.bouncycastle.pqc.crypto.mlkem.MLKEMKeyPairGenerator;
1517
import org.bouncycastle.pqc.crypto.mlkem.MLKEMParameters;
@@ -35,7 +37,7 @@ public class MLKEMKeyPairGeneratorSpi
3537

3638
SecureRandom random = CryptoServicesRegistrar.getSecureRandom();
3739
boolean initialised = false;
38-
private MLKEMParameters kyberParameters;
40+
private MLKEMParameters mlkemParameters;
3941

4042
public MLKEMKeyPairGeneratorSpi()
4143
{
@@ -45,11 +47,11 @@ public MLKEMKeyPairGeneratorSpi()
4547
protected MLKEMKeyPairGeneratorSpi(MLKEMParameterSpec paramSpec)
4648
{
4749
super(Strings.toUpperCase(paramSpec.getName()));
48-
this.kyberParameters = (MLKEMParameters) parameters.get(paramSpec.getName());
50+
this.mlkemParameters = (MLKEMParameters) parameters.get(paramSpec.getName());
4951

5052
if (param == null)
5153
{
52-
param = new MLKEMKeyGenerationParameters(random, kyberParameters);
54+
param = new MLKEMKeyGenerationParameters(random, mlkemParameters);
5355
}
5456

5557
engine.init(param);
@@ -63,25 +65,44 @@ public void initialize(
6365
throw new IllegalArgumentException("use AlgorithmParameterSpec");
6466
}
6567

68+
public void initialize(
69+
AlgorithmParameterSpec params)
70+
throws InvalidAlgorithmParameterException
71+
{
72+
try
73+
{
74+
initialize(params, new BCJcaJceHelper().createSecureRandom("DEFAULT"));
75+
}
76+
catch (NoSuchAlgorithmException e)
77+
{
78+
throw new IllegalStateException("unable to find DEFAULT DRBG");
79+
}
80+
}
81+
6682
public void initialize(
6783
AlgorithmParameterSpec params,
6884
SecureRandom random)
6985
throws InvalidAlgorithmParameterException
7086
{
71-
7287
String name = getNameFromParams(params);
7388

7489
MLKEMParameters kyberParams = (MLKEMParameters)parameters.get(name);
7590

7691
if (name != null)
7792
{
78-
param = new MLKEMKeyGenerationParameters(random, (MLKEMParameters) parameters.get(name));
93+
MLKEMParameters mlkemParams = (MLKEMParameters)parameters.get(name);
94+
if (mlkemParams == null)
95+
{
96+
throw new InvalidAlgorithmParameterException("unknown parameter set name: " + name);
97+
}
7998

80-
if (kyberParameters != null && !kyberParams.getName().equals(kyberParameters.getName()))
99+
if (mlkemParameters != null && !mlkemParams.getName().equals(mlkemParameters.getName()))
81100
{
82101
throw new InvalidAlgorithmParameterException("key pair generator locked to " + getAlgorithm());
83102
}
84103

104+
param = new MLKEMKeyGenerationParameters(random, (MLKEMParameters)mlkemParams);
105+
85106
engine.init(param);
86107
initialised = true;
87108
}
@@ -113,11 +134,11 @@ private static String getNameFromParams(AlgorithmParameterSpec paramSpec)
113134
if (paramSpec instanceof MLKEMParameterSpec)
114135
{
115136
MLKEMParameterSpec params = (MLKEMParameterSpec)paramSpec;
116-
return Strings.toLowerCase(params.getName());
137+
return params.getName();
117138
}
118139
else
119140
{
120-
return Strings.toLowerCase(SpecUtil.getNameFrom(paramSpec));
141+
return Strings.toUpperCase(SpecUtil.getNameFrom(paramSpec));
121142
}
122143
}
123144

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/slhdsa/SLHDSAKeyPairGeneratorSpi.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,12 @@ public void initialize(
9292

9393
if (name != null)
9494
{
95-
param = new SLHDSAKeyGenerationParameters(random, (SLHDSAParameters)parameters.get(name));
95+
SLHDSAParameters parameters = (SLHDSAParameters)SLHDSAKeyPairGeneratorSpi.parameters.get(name);
96+
if (parameters == null)
97+
{
98+
throw new InvalidAlgorithmParameterException("unknown parameter set name: " + name);
99+
}
100+
param = new SLHDSAKeyGenerationParameters(random, parameters);
96101

97102
engine.init(param);
98103
initialised = true;
@@ -132,11 +137,11 @@ private static String getNameFromParams(AlgorithmParameterSpec paramSpec)
132137
if (paramSpec instanceof SLHDSAParameterSpec)
133138
{
134139
SLHDSAParameterSpec params = (SLHDSAParameterSpec)paramSpec;
135-
return Strings.toLowerCase(params.getName());
140+
return params.getName();
136141
}
137142
else
138143
{
139-
return Strings.toLowerCase(SpecUtil.getNameFrom(paramSpec));
144+
return Strings.toUpperCase(SpecUtil.getNameFrom(paramSpec));
140145
}
141146
}
142147

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.bouncycastle.pqc.jcajce.provider.test;
22

3+
import java.security.InvalidAlgorithmParameterException;
34
import java.security.KeyFactory;
45
import java.security.KeyPair;
56
import java.security.KeyPairGenerator;
@@ -13,7 +14,9 @@
1314
import org.bouncycastle.jcajce.interfaces.MLDSAPublicKey;
1415
import org.bouncycastle.jcajce.spec.MLDSAParameterSpec;
1516
import org.bouncycastle.jce.provider.BouncyCastleProvider;
17+
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec;
1618
import org.bouncycastle.util.Arrays;
19+
import org.bouncycastle.util.Strings;
1720

1821
/**
1922
* KeyFactory/KeyPairGenerator tests for MLDSA with BC provider.
@@ -67,6 +70,29 @@ public void testKeyPairGeneratorNames()
6770
assertEquals(algs[i], kp.getPrivate().getAlgorithm());
6871
assertEquals(algs[i], kp.getPublic().getAlgorithm());
6972
}
73+
74+
//
75+
// a bit of a cheat as we just look for "getName()" on the parameter spec.
76+
//
77+
for (int i = 0; i != algs.length; i++)
78+
{
79+
KeyPairGenerator kpg = KeyPairGenerator.getInstance(algs[i], "BC");
80+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toLowerCase(algs[i])));
81+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toUpperCase(algs[i])));
82+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toLowerCase(algs[i])), new SecureRandom());
83+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toUpperCase(algs[i])), new SecureRandom());
84+
}
85+
86+
try
87+
{
88+
KeyPairGenerator kpg = KeyPairGenerator.getInstance(algs[0], "BC");
89+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toLowerCase("Not Valid")));
90+
fail("no exception");
91+
}
92+
catch (InvalidAlgorithmParameterException e)
93+
{
94+
assertEquals("unknown parameter set name: NOT VALID", e.getMessage());
95+
}
7096
}
7197

7298
public void testKeyPairEncoding()

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

Lines changed: 66 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.bouncycastle.pqc.jcajce.provider.test;
22

33

4+
import java.security.InvalidAlgorithmParameterException;
45
import java.security.KeyFactory;
56
import java.security.KeyPair;
67
import java.security.KeyPairGenerator;
@@ -14,13 +15,15 @@
1415
import org.bouncycastle.jcajce.interfaces.MLKEMPublicKey;
1516
import org.bouncycastle.jcajce.spec.MLKEMParameterSpec;
1617
import org.bouncycastle.jce.provider.BouncyCastleProvider;
18+
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec;
1719
import org.bouncycastle.util.Arrays;
20+
import org.bouncycastle.util.Strings;
1821

1922
/**
2023
* KeyFactory/KeyPairGenerator tests for MLKEM with BCPQC provider.
2124
*/
2225
public class MLKEMKeyPairGeneratorTest
23-
extends KeyPairGeneratorTest
26+
extends KeyPairGeneratorTest
2427
{
2528
protected void setUp()
2629
{
@@ -32,28 +35,77 @@ protected void setUp()
3235
}
3336

3437
public void testKeyFactory()
35-
throws Exception
38+
throws Exception
3639
{
3740
kf = KeyFactory.getInstance("ML-KEM", "BC");
3841
}
3942

43+
public void testKeyPairGeneratorNames()
44+
throws Exception
45+
{
46+
ASN1ObjectIdentifier[] oids = new ASN1ObjectIdentifier[]{
47+
NISTObjectIdentifiers.id_alg_ml_kem_512,
48+
NISTObjectIdentifiers.id_alg_ml_kem_768,
49+
NISTObjectIdentifiers.id_alg_ml_kem_1024
50+
};
51+
52+
String[] algs = new String[]{
53+
"ML-KEM-512",
54+
"ML-KEM-768",
55+
"ML-KEM-1024"
56+
};
57+
58+
for (int i = 0; i != oids.length; i++)
59+
{
60+
KeyPairGenerator kpGen = KeyPairGenerator.getInstance(oids[i].getId(), "BC");
61+
62+
KeyPair kp = kpGen.generateKeyPair();
63+
64+
assertEquals(algs[i], kp.getPrivate().getAlgorithm());
65+
assertEquals(algs[i], kp.getPublic().getAlgorithm());
66+
}
67+
68+
//
69+
// a bit of a cheat as we just look for "getName()" on the parameter spec.
70+
//
71+
for (int i = 0; i != algs.length; i++)
72+
{
73+
KeyPairGenerator kpg = KeyPairGenerator.getInstance(algs[i], "BC");
74+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toLowerCase(algs[i])));
75+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toUpperCase(algs[i])));
76+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toLowerCase(algs[i])), new SecureRandom());
77+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toUpperCase(algs[i])), new SecureRandom());
78+
}
79+
80+
try
81+
{
82+
KeyPairGenerator kpg = KeyPairGenerator.getInstance(algs[0], "BC");
83+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toLowerCase("Not Valid")));
84+
fail("no exception");
85+
}
86+
catch (InvalidAlgorithmParameterException e)
87+
{
88+
assertEquals("unknown parameter set name: NOT VALID", e.getMessage());
89+
}
90+
}
91+
4092
public void testKeyPairEncoding()
41-
throws Exception
93+
throws Exception
4294
{
4395
MLKEMParameterSpec[] params =
44-
new MLKEMParameterSpec[]
45-
{
46-
MLKEMParameterSpec.ml_kem_512,
47-
MLKEMParameterSpec.ml_kem_768,
48-
MLKEMParameterSpec.ml_kem_1024,
49-
};
50-
// expected object identifiers
51-
ASN1ObjectIdentifier[] oids =
96+
new MLKEMParameterSpec[]
5297
{
53-
NISTObjectIdentifiers.id_alg_ml_kem_512,
54-
NISTObjectIdentifiers.id_alg_ml_kem_768,
55-
NISTObjectIdentifiers.id_alg_ml_kem_1024,
98+
MLKEMParameterSpec.ml_kem_512,
99+
MLKEMParameterSpec.ml_kem_768,
100+
MLKEMParameterSpec.ml_kem_1024,
56101
};
102+
// expected object identifiers
103+
ASN1ObjectIdentifier[] oids =
104+
{
105+
NISTObjectIdentifiers.id_alg_ml_kem_512,
106+
NISTObjectIdentifiers.id_alg_ml_kem_768,
107+
NISTObjectIdentifiers.id_alg_ml_kem_1024,
108+
};
57109
kf = KeyFactory.getInstance("ML-KEM", "BC");
58110

59111
kpg = KeyPairGenerator.getInstance("ML-KEM", "BC");

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.bouncycastle.pqc.jcajce.provider.test;
22

3+
import java.security.InvalidAlgorithmParameterException;
34
import java.security.Key;
45
import java.security.KeyFactory;
56
import java.security.KeyPair;
@@ -17,7 +18,9 @@
1718
import org.bouncycastle.jcajce.interfaces.SLHDSAPublicKey;
1819
import org.bouncycastle.jcajce.spec.SLHDSAParameterSpec;
1920
import org.bouncycastle.jce.provider.BouncyCastleProvider;
21+
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec;
2022
import org.bouncycastle.util.Arrays;
23+
import org.bouncycastle.util.Strings;
2124

2225

2326
/**
@@ -158,6 +161,29 @@ public void testKeyPairEncoding()
158161
assertEquals(oids[i], SubjectPublicKeyInfo.getInstance(keyPair.getPublic().getEncoded()).getAlgorithm().getAlgorithm());
159162
assertTrue(oids[i].toString(), Arrays.areEqual(((SLHDSAPublicKey)keyPair.getPublic()).getPublicData(), ((SLHDSAPrivateKey)keyPair.getPrivate()).getPublicKey().getPublicData()));
160163
}
164+
165+
//
166+
// a bit of a cheat as we just look for "getName()" on the parameter spec.
167+
//
168+
for (int i = 0; i != params.length; i++)
169+
{
170+
KeyPairGenerator kpg = KeyPairGenerator.getInstance(params[i].getName(), "BC");
171+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toLowerCase(params[i].getName())));
172+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toUpperCase(params[i].getName())));
173+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toLowerCase(params[i].getName())), new SecureRandom());
174+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toUpperCase(params[i].getName())), new SecureRandom());
175+
}
176+
177+
try
178+
{
179+
KeyPairGenerator kpg = KeyPairGenerator.getInstance(params[0].getName(), "BC");
180+
kpg.initialize(new ECNamedCurveGenParameterSpec(Strings.toLowerCase("Not Valid")));
181+
fail("no exception");
182+
}
183+
catch (InvalidAlgorithmParameterException e)
184+
{
185+
assertEquals("unknown parameter set name: NOT VALID", e.getMessage());
186+
}
161187
}
162188

163189
public void testCrossNaming()

0 commit comments

Comments
 (0)