Skip to content

Commit 74077f8

Browse files
committed
promoted pqc/crypto/mldsa to the universal crypto package. Deprecated pqc/crypto/mldsa.
1 parent e76a2d8 commit 74077f8

16 files changed

Lines changed: 172 additions & 36 deletions

File tree

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

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

77
import org.bouncycastle.asn1.ASN1Set;
88
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
9+
import org.bouncycastle.crypto.params.MLDSAPrivateKeyParameters;
10+
import org.bouncycastle.crypto.params.MLDSAPublicKeyParameters;
11+
import org.bouncycastle.crypto.util.PrivateKeyFactory;
912
import org.bouncycastle.jcajce.interfaces.BCKey;
1013
import org.bouncycastle.jcajce.interfaces.MLDSAPrivateKey;
1114
import org.bouncycastle.jcajce.interfaces.MLDSAPublicKey;
15+
import org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil;
1216
import org.bouncycastle.jcajce.spec.MLDSAParameterSpec;
13-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPrivateKeyParameters;
14-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPublicKeyParameters;
15-
import org.bouncycastle.pqc.crypto.util.PrivateKeyFactory;
16-
import org.bouncycastle.pqc.jcajce.provider.util.KeyUtil;
1717
import org.bouncycastle.util.Arrays;
1818
import org.bouncycastle.util.Fingerprint;
1919
import org.bouncycastle.util.Strings;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
import java.io.ObjectOutputStream;
66

77
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
8+
import org.bouncycastle.crypto.params.MLDSAPublicKeyParameters;
9+
import org.bouncycastle.crypto.util.PublicKeyFactory;
10+
import org.bouncycastle.crypto.util.SubjectPublicKeyInfoFactory;
811
import org.bouncycastle.jcajce.interfaces.BCKey;
912
import org.bouncycastle.jcajce.interfaces.MLDSAPublicKey;
1013
import org.bouncycastle.jcajce.spec.MLDSAParameterSpec;
11-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPublicKeyParameters;
12-
import org.bouncycastle.pqc.crypto.util.PublicKeyFactory;
13-
import org.bouncycastle.pqc.crypto.util.SubjectPublicKeyInfoFactory;
1414
import org.bouncycastle.util.Arrays;
1515
import org.bouncycastle.util.Fingerprint;
1616
import org.bouncycastle.util.Strings;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
import java.security.SignatureException;
99

1010
import org.bouncycastle.crypto.CipherParameters;
11+
import org.bouncycastle.crypto.params.MLDSAParameters;
12+
import org.bouncycastle.crypto.signers.HashMLDSASigner;
1113
import org.bouncycastle.jcajce.provider.asymmetric.util.BaseDeterministicOrRandomSignature;
1214
import org.bouncycastle.jcajce.spec.MLDSAParameterSpec;
13-
import org.bouncycastle.pqc.crypto.mldsa.HashMLDSASigner;
14-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAParameters;
1515

1616
public class HashSignatureSpi
1717
extends BaseDeterministicOrRandomSignature

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@
1616
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
1717
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
1818
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
19+
import org.bouncycastle.crypto.params.MLDSAParameters;
20+
import org.bouncycastle.crypto.params.MLDSAPrivateKeyParameters;
21+
import org.bouncycastle.crypto.params.MLDSAPublicKeyParameters;
22+
import org.bouncycastle.jcajce.provider.asymmetric.util.BasePQCKeyFactorySpi;
1923
import org.bouncycastle.jcajce.spec.MLDSAPrivateKeySpec;
2024
import org.bouncycastle.jcajce.spec.MLDSAPublicKeySpec;
21-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAParameters;
22-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPrivateKeyParameters;
23-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPublicKeyParameters;
24-
import org.bouncycastle.pqc.jcajce.provider.util.BaseKeyFactorySpi;
2525
import org.bouncycastle.util.Arrays;
2626

2727
public class MLDSAKeyFactorySpi
28-
extends BaseKeyFactorySpi
28+
extends BasePQCKeyFactorySpi
2929
{
3030
private static final Set<ASN1ObjectIdentifier> pureKeyOids = new HashSet<ASN1ObjectIdentifier>();
3131
private static final Set<ASN1ObjectIdentifier> hashKeyOids = new HashSet<ASN1ObjectIdentifier>();

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88

99
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
1010
import org.bouncycastle.crypto.CryptoServicesRegistrar;
11+
import org.bouncycastle.crypto.generators.MLDSAKeyPairGenerator;
12+
import org.bouncycastle.crypto.params.MLDSAKeyGenerationParameters;
13+
import org.bouncycastle.crypto.params.MLDSAParameters;
14+
import org.bouncycastle.crypto.params.MLDSAPrivateKeyParameters;
15+
import org.bouncycastle.crypto.params.MLDSAPublicKeyParameters;
1116
import org.bouncycastle.jcajce.spec.MLDSAParameterSpec;
1217
import org.bouncycastle.jcajce.util.BCJcaJceHelper;
1318
import org.bouncycastle.jcajce.util.SpecUtil;
14-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAKeyGenerationParameters;
15-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAKeyPairGenerator;
16-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAParameters;
17-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPrivateKeyParameters;
18-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPublicKeyParameters;
1919
import org.bouncycastle.util.Strings;
2020

2121
public class MLDSAKeyPairGeneratorSpi

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
1313
import org.bouncycastle.crypto.CipherParameters;
1414
import org.bouncycastle.crypto.DataLengthException;
15+
import org.bouncycastle.crypto.params.MLDSAParameters;
16+
import org.bouncycastle.crypto.params.MLDSAPublicKeyParameters;
17+
import org.bouncycastle.crypto.signers.MLDSASigner;
18+
import org.bouncycastle.crypto.util.PublicKeyFactory;
1519
import org.bouncycastle.jcajce.MLDSAProxyPrivateKey;
1620
import org.bouncycastle.jcajce.interfaces.MLDSAPublicKey;
1721
import org.bouncycastle.jcajce.provider.asymmetric.util.BaseDeterministicOrRandomSignature;
1822
import org.bouncycastle.jcajce.spec.MLDSAParameterSpec;
19-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAParameters;
20-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPublicKeyParameters;
21-
import org.bouncycastle.pqc.crypto.mldsa.MLDSASigner;
22-
import org.bouncycastle.pqc.crypto.util.PublicKeyFactory;
2323

2424
public class SignatureSpi
2525
extends BaseDeterministicOrRandomSignature

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import java.util.HashMap;
44
import java.util.Map;
55

6+
import org.bouncycastle.crypto.params.MLDSAParameters;
67
import org.bouncycastle.jcajce.spec.MLDSAParameterSpec;
7-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAParameters;
88

99
class Utils
1010
{

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66

77
import org.bouncycastle.asn1.ASN1Set;
88
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
9+
import org.bouncycastle.crypto.params.MLDSAPrivateKeyParameters;
910
import org.bouncycastle.jcajce.interfaces.BCKey;
1011
import org.bouncycastle.jcajce.interfaces.MLKEMPrivateKey;
1112
import org.bouncycastle.jcajce.interfaces.MLKEMPublicKey;
1213
import org.bouncycastle.jcajce.spec.MLKEMParameterSpec;
13-
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPrivateKeyParameters;
1414
import org.bouncycastle.pqc.crypto.mlkem.MLKEMPrivateKeyParameters;
1515
import org.bouncycastle.pqc.crypto.util.PrivateKeyFactory;
1616
import org.bouncycastle.pqc.crypto.util.PrivateKeyInfoFactory;
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package org.bouncycastle.jcajce.provider.asymmetric.util;
2+
3+
import java.security.KeyFactorySpi;
4+
import java.security.PrivateKey;
5+
import java.security.PublicKey;
6+
import java.security.spec.InvalidKeySpecException;
7+
import java.security.spec.KeySpec;
8+
import java.security.spec.PKCS8EncodedKeySpec;
9+
import java.security.spec.X509EncodedKeySpec;
10+
import java.util.Set;
11+
12+
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
13+
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
14+
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
15+
import org.bouncycastle.jcajce.provider.util.AsymmetricKeyInfoConverter;
16+
17+
public abstract class BasePQCKeyFactorySpi
18+
extends KeyFactorySpi
19+
implements AsymmetricKeyInfoConverter
20+
{
21+
private final Set<ASN1ObjectIdentifier> keyOids;
22+
private final ASN1ObjectIdentifier keyOid;
23+
24+
protected BasePQCKeyFactorySpi(Set<ASN1ObjectIdentifier> keyOids)
25+
{
26+
this.keyOid = null;
27+
this.keyOids = keyOids;
28+
}
29+
30+
protected BasePQCKeyFactorySpi(ASN1ObjectIdentifier keyOid)
31+
{
32+
this.keyOid = keyOid;
33+
this.keyOids = null;
34+
}
35+
36+
public PrivateKey engineGeneratePrivate(KeySpec keySpec)
37+
throws InvalidKeySpecException
38+
{
39+
if (keySpec instanceof PKCS8EncodedKeySpec)
40+
{
41+
// get the DER-encoded Key according to PKCS#8 from the spec
42+
byte[] encKey = ((PKCS8EncodedKeySpec)keySpec).getEncoded();
43+
44+
try
45+
{
46+
PrivateKeyInfo keyInfo = PrivateKeyInfo.getInstance(encKey);
47+
48+
checkAlgorithm(keyInfo.getPrivateKeyAlgorithm().getAlgorithm());
49+
50+
return generatePrivate(keyInfo);
51+
}
52+
catch (InvalidKeySpecException e)
53+
{
54+
throw e;
55+
}
56+
catch (IllegalStateException e)
57+
{
58+
throw new InvalidKeySpecException(e.getMessage());
59+
}
60+
catch (Exception e)
61+
{
62+
throw new InvalidKeySpecException(e.toString());
63+
}
64+
}
65+
66+
throw new InvalidKeySpecException("Unsupported key specification: "
67+
+ keySpec.getClass() + ".");
68+
}
69+
70+
public PublicKey engineGeneratePublic(KeySpec keySpec)
71+
throws InvalidKeySpecException
72+
{
73+
if (keySpec instanceof X509EncodedKeySpec)
74+
{
75+
// get the DER-encoded Key according to X.509 from the spec
76+
byte[] encKey = ((X509EncodedKeySpec)keySpec).getEncoded();
77+
78+
// decode the SubjectPublicKeyInfo data structure to the pki object
79+
try
80+
{
81+
SubjectPublicKeyInfo keyInfo = SubjectPublicKeyInfo.getInstance(encKey);
82+
83+
checkAlgorithm(keyInfo.getAlgorithm().getAlgorithm());
84+
85+
return generatePublic(keyInfo);
86+
}
87+
catch (InvalidKeySpecException e)
88+
{
89+
throw e;
90+
}
91+
catch (Exception e)
92+
{
93+
throw new InvalidKeySpecException(e.toString());
94+
}
95+
}
96+
97+
throw new InvalidKeySpecException("Unknown key specification: " + keySpec + ".");
98+
}
99+
100+
private void checkAlgorithm(ASN1ObjectIdentifier algOid)
101+
throws InvalidKeySpecException
102+
{
103+
if (keyOid != null)
104+
{
105+
if (!keyOid.equals(algOid))
106+
{
107+
throw new InvalidKeySpecException("incorrect algorithm OID for key: " + algOid);
108+
}
109+
}
110+
else if (!keyOids.contains(algOid))
111+
{
112+
throw new InvalidKeySpecException("incorrect algorithm OID for key: " + algOid);
113+
}
114+
}
115+
}

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/util/KeyUtil.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
import org.bouncycastle.asn1.ASN1Encodable;
44
import org.bouncycastle.asn1.ASN1Encoding;
5+
import org.bouncycastle.asn1.ASN1Set;
56
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
67
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
78
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
9+
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
10+
import org.bouncycastle.crypto.util.PrivateKeyInfoFactory;
811

912
public class KeyUtil
1013
{
@@ -58,6 +61,24 @@ public static byte[] getEncodedPrivateKeyInfo(AlgorithmIdentifier algId, ASN1Enc
5861
}
5962
}
6063

64+
65+
public static byte[] getEncodedPrivateKeyInfo(AsymmetricKeyParameter privateKey, ASN1Set attributes)
66+
{
67+
if (!privateKey.isPrivate())
68+
{
69+
throw new IllegalArgumentException("public key found");
70+
}
71+
72+
try
73+
{
74+
return getEncodedPrivateKeyInfo(PrivateKeyInfoFactory.createPrivateKeyInfo(privateKey, attributes));
75+
}
76+
catch (Exception e)
77+
{
78+
return null;
79+
}
80+
}
81+
6182
public static byte[] getEncodedPrivateKeyInfo(PrivateKeyInfo info)
6283
{
6384
try

0 commit comments

Comments
 (0)