Skip to content

Commit c8fe4d7

Browse files
committed
fixed old dilithium for compatibility.
1 parent cbecef3 commit c8fe4d7

File tree

3 files changed

+69
-18
lines changed

3 files changed

+69
-18
lines changed

core/src/main/java/org/bouncycastle/pqc/crypto/util/PrivateKeyFactory.java

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
import org.bouncycastle.pqc.crypto.bike.BIKEPrivateKeyParameters;
3434
import org.bouncycastle.pqc.crypto.cmce.CMCEParameters;
3535
import org.bouncycastle.pqc.crypto.cmce.CMCEPrivateKeyParameters;
36+
import org.bouncycastle.pqc.crypto.crystals.dilithium.DilithiumParameters;
37+
import org.bouncycastle.pqc.crypto.crystals.dilithium.DilithiumPrivateKeyParameters;
38+
import org.bouncycastle.pqc.crypto.crystals.dilithium.DilithiumPublicKeyParameters;
3639
import org.bouncycastle.pqc.crypto.falcon.FalconParameters;
3740
import org.bouncycastle.pqc.crypto.falcon.FalconPrivateKeyParameters;
3841
import org.bouncycastle.pqc.crypto.frodo.FrodoParameters;
@@ -245,8 +248,8 @@ else if (algOID.on(BCObjectIdentifiers.pqc_kem_ntru))
245248
return new NTRUPrivateKeyParameters(spParams, keyEnc);
246249
}
247250
else if (algOID.equals(NISTObjectIdentifiers.id_alg_ml_kem_512) ||
248-
algOID.equals(NISTObjectIdentifiers.id_alg_ml_kem_768) ||
249-
algOID.equals(NISTObjectIdentifiers.id_alg_ml_kem_1024))
251+
algOID.equals(NISTObjectIdentifiers.id_alg_ml_kem_768) ||
252+
algOID.equals(NISTObjectIdentifiers.id_alg_ml_kem_1024))
250253
{
251254
ASN1OctetString kyberKey = ASN1OctetString.getInstance(keyInfo.parsePrivateKey());
252255
MLKEMParameters kyberParams = Utils.kyberParamsLookup(algOID);
@@ -319,15 +322,61 @@ else if (algOID.equals(NISTObjectIdentifiers.id_ml_dsa_44)
319322
null);
320323
}
321324
}
325+
else
326+
{
327+
throw new IOException("not supported");
328+
}
329+
}
330+
else if (algOID.equals(BCObjectIdentifiers.dilithium2)
331+
|| algOID.equals(BCObjectIdentifiers.dilithium3) || algOID.equals(BCObjectIdentifiers.dilithium5))
332+
{
333+
ASN1Encodable keyObj = keyInfo.parsePrivateKey();
334+
DilithiumParameters dilParams = Utils.dilithiumParamsLookup(algOID);
335+
336+
if (keyObj instanceof ASN1Sequence)
337+
{
338+
ASN1Sequence keyEnc = ASN1Sequence.getInstance(keyObj);
339+
340+
int version = ASN1Integer.getInstance(keyEnc.getObjectAt(0)).intValueExact();
341+
if (version != 0)
342+
{
343+
throw new IOException("unknown private key version: " + version);
344+
}
345+
346+
if (keyInfo.getPublicKeyData() != null)
347+
{
348+
DilithiumPublicKeyParameters pubParams = PublicKeyFactory.DilithiumConverter.getPublicKeyParams(dilParams, keyInfo.getPublicKeyData());
349+
350+
return new DilithiumPrivateKeyParameters(dilParams,
351+
ASN1BitString.getInstance(keyEnc.getObjectAt(1)).getOctets(),
352+
ASN1BitString.getInstance(keyEnc.getObjectAt(2)).getOctets(),
353+
ASN1BitString.getInstance(keyEnc.getObjectAt(3)).getOctets(),
354+
ASN1BitString.getInstance(keyEnc.getObjectAt(4)).getOctets(),
355+
ASN1BitString.getInstance(keyEnc.getObjectAt(5)).getOctets(),
356+
ASN1BitString.getInstance(keyEnc.getObjectAt(6)).getOctets(),
357+
pubParams.getT1()); // encT1
358+
}
359+
else
360+
{
361+
return new DilithiumPrivateKeyParameters(dilParams,
362+
ASN1BitString.getInstance(keyEnc.getObjectAt(1)).getOctets(),
363+
ASN1BitString.getInstance(keyEnc.getObjectAt(2)).getOctets(),
364+
ASN1BitString.getInstance(keyEnc.getObjectAt(3)).getOctets(),
365+
ASN1BitString.getInstance(keyEnc.getObjectAt(4)).getOctets(),
366+
ASN1BitString.getInstance(keyEnc.getObjectAt(5)).getOctets(),
367+
ASN1BitString.getInstance(keyEnc.getObjectAt(6)).getOctets(),
368+
null);
369+
}
370+
}
322371
else if (keyObj instanceof DEROctetString)
323372
{
324373
byte[] data = ASN1OctetString.getInstance(keyObj).getOctets();
325374
if (keyInfo.getPublicKeyData() != null)
326375
{
327-
MLDSAPublicKeyParameters pubParams = PublicKeyFactory.MLDSAConverter.getPublicKeyParams(spParams, keyInfo.getPublicKeyData());
328-
return new MLDSAPrivateKeyParameters(spParams, data, pubParams);
376+
DilithiumPublicKeyParameters pubParams = PublicKeyFactory.DilithiumConverter.getPublicKeyParams(dilParams, keyInfo.getPublicKeyData());
377+
return new DilithiumPrivateKeyParameters(dilParams, data, pubParams);
329378
}
330-
return new MLDSAPrivateKeyParameters(spParams, data, null);
379+
return new DilithiumPrivateKeyParameters(dilParams, data, null);
331380
}
332381
else
333382
{

prov/src/main/java/org/bouncycastle/pqc/jcajce/provider/dilithium/DilithiumKeyFactorySpi.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
1616
import org.bouncycastle.asn1.bc.BCObjectIdentifiers;
17-
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
1817
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
1918
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
2019
import org.bouncycastle.pqc.jcajce.provider.util.BaseKeyFactorySpi;
@@ -26,6 +25,9 @@ public class DilithiumKeyFactorySpi
2625

2726
static
2827
{
28+
keyOids.add(BCObjectIdentifiers.dilithium2);
29+
keyOids.add(BCObjectIdentifiers.dilithium3);
30+
keyOids.add(BCObjectIdentifiers.dilithium5);
2931
keyOids.add(BCObjectIdentifiers.dilithium2_aes);
3032
keyOids.add(BCObjectIdentifiers.dilithium3_aes);
3133
keyOids.add(BCObjectIdentifiers.dilithium5_aes);
@@ -96,7 +98,7 @@ public static class Base2
9698
{
9799
public Base2()
98100
{
99-
super(NISTObjectIdentifiers.id_ml_dsa_44);
101+
super(BCObjectIdentifiers.dilithium2);
100102
}
101103
}
102104

@@ -105,7 +107,7 @@ public static class Base3
105107
{
106108
public Base3()
107109
{
108-
super(NISTObjectIdentifiers.id_ml_dsa_65);
110+
super(BCObjectIdentifiers.dilithium3);
109111
}
110112
}
111113

@@ -114,7 +116,7 @@ public static class Base5
114116
{
115117
public Base5()
116118
{
117-
super(NISTObjectIdentifiers.id_ml_dsa_87);
119+
super(BCObjectIdentifiers.dilithium5);
118120
}
119121
}
120122

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import java.security.Security;
88

99
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
10-
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
10+
import org.bouncycastle.asn1.bc.BCObjectIdentifiers;
1111
import org.bouncycastle.jce.provider.BouncyCastleProvider;
1212
import org.bouncycastle.pqc.jcajce.spec.DilithiumParameterSpec;
1313

@@ -36,15 +36,15 @@ public void testKeyPairGeneratorNames()
3636
throws Exception
3737
{
3838
ASN1ObjectIdentifier[] oids = new ASN1ObjectIdentifier[] {
39-
NISTObjectIdentifiers.id_ml_dsa_44,
40-
NISTObjectIdentifiers.id_ml_dsa_65,
41-
NISTObjectIdentifiers.id_ml_dsa_87
39+
BCObjectIdentifiers.dilithium2,
40+
BCObjectIdentifiers.dilithium3,
41+
BCObjectIdentifiers.dilithium5
4242
};
4343

4444
String[] algs = new String[]{
45-
"ML-DSA-44",
46-
"ML-DSA-65",
47-
"ML-DSA-87"
45+
"DILITHIUM2",
46+
"DILITHIUM3",
47+
"DILITHIUM5"
4848
};
4949

5050
for (int i = 0; i != oids.length; i++)
@@ -68,9 +68,9 @@ public void testKeyPairEncoding()
6868
DilithiumParameterSpec.dilithium3,
6969
DilithiumParameterSpec.dilithium5,
7070
};
71-
kf = KeyFactory.getInstance("Dilithium", "BC");
71+
kf = KeyFactory.getInstance("Dilithium", "BCPQC");
7272

73-
kpg = KeyPairGenerator.getInstance("Dilithium", "BC");
73+
kpg = KeyPairGenerator.getInstance("Dilithium", "BCPQC");
7474

7575
for (int i = 0; i != specs.length; i++)
7676
{

0 commit comments

Comments
 (0)