Skip to content

Commit c7682d1

Browse files
committed
TLS: Alternate ML-KEM key pair generation to allow use of our SecureRandom
1 parent b81d8e3 commit c7682d1

File tree

2 files changed

+19
-14
lines changed

2 files changed

+19
-14
lines changed

tls/src/main/java/org/bouncycastle/tls/crypto/impl/jcajce/JceTlsMLKemDomain.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.bouncycastle.tls.crypto.impl.jcajce;
22

33
import java.io.IOException;
4+
import java.security.GeneralSecurityException;
45
import java.security.KeyPair;
56
import java.security.KeyPairGenerator;
67
import java.security.PrivateKey;
@@ -11,6 +12,7 @@
1112
import org.bouncycastle.jcajce.SecretKeyWithEncapsulation;
1213
import org.bouncycastle.jcajce.spec.KEMExtractSpec;
1314
import org.bouncycastle.jcajce.spec.KEMGenerateSpec;
15+
import org.bouncycastle.jcajce.spec.MLKEMParameterSpec;
1416
import org.bouncycastle.tls.NamedGroup;
1517
import org.bouncycastle.tls.crypto.TlsAgreement;
1618
import org.bouncycastle.tls.crypto.TlsKemConfig;
@@ -43,7 +45,7 @@ public JceTlsSecret decapsulate(PrivateKey privateKey, byte[] ciphertext)
4345
{
4446
try
4547
{
46-
KeyGenerator keyGenerator = KemUtil.getKeyGenerator(crypto, kemName);
48+
KeyGenerator keyGenerator = crypto.getHelper().createKeyGenerator(kemName);
4749
keyGenerator.init(new KEMExtractSpec.Builder(privateKey, ciphertext, "DEF", 256).withNoKdf().build());
4850
SecretKeyWithEncapsulation secEnc = (SecretKeyWithEncapsulation)keyGenerator.generateKey();
4951
return adoptLocalSecret(secEnc.getEncoded());
@@ -64,7 +66,7 @@ public SecretKeyWithEncapsulation encapsulate(PublicKey publicKey)
6466
{
6567
try
6668
{
67-
KeyGenerator keyGenerator = KemUtil.getKeyGenerator(crypto, kemName);
69+
KeyGenerator keyGenerator = crypto.getHelper().createKeyGenerator(kemName);
6870
keyGenerator.init(new KEMGenerateSpec.Builder(publicKey, "DEF", 256).withNoKdf().build());
6971
return (SecretKeyWithEncapsulation)keyGenerator.generateKey();
7072
}
@@ -82,20 +84,21 @@ public byte[] encodePublicKey(PublicKey publicKey)
8284

8385
public KeyPair generateKeyPair()
8486
{
85-
// TODO How to pass only the SecureRandom?
86-
// try
87-
// {
87+
try
88+
{
89+
// TODO How to pass only the SecureRandom to initialize if we use the full name in the getInstance?
8890
// KeyPairGenerator keyPairGenerator = KemUtil.getKeyPairGenerator(crypto, kemName);
8991
// keyPairGenerator.initialize((AlgorithmParameterSpec)null, crypto.getSecureRandom());
9092
// return keyPairGenerator.generateKeyPair();
91-
// }
92-
// catch (GeneralSecurityException e)
93-
// {
94-
// throw Exceptions.illegalStateException("unable to create key pair: " + e.getMessage(), e);
95-
// }
9693

97-
KeyPairGenerator keyPairGenerator = KemUtil.getKeyPairGenerator(crypto, kemName);
98-
return keyPairGenerator.generateKeyPair();
94+
KeyPairGenerator keyPairGenerator = crypto.getHelper().createKeyPairGenerator("ML-KEM");
95+
keyPairGenerator.initialize(MLKEMParameterSpec.fromName(kemName), crypto.getSecureRandom());
96+
return keyPairGenerator.generateKeyPair();
97+
}
98+
catch (GeneralSecurityException e)
99+
{
100+
throw Exceptions.illegalStateException("unable to create key pair: " + e.getMessage(), e);
101+
}
99102
}
100103

101104
public boolean isServer()

tls/src/main/java/org/bouncycastle/tls/crypto/impl/jcajce/KemUtil.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,9 @@ static KeyPairGenerator getKeyPairGenerator(JcaTlsCrypto crypto, String kemName)
116116
{
117117
try
118118
{
119-
return crypto.getHelper().createKeyPairGenerator(kemName);
119+
KeyPairGenerator keyPairGenerator = crypto.getHelper().createKeyPairGenerator("ML-KEM");
120+
keyPairGenerator.initialize(MLKEMParameterSpec.fromName(kemName), crypto.getSecureRandom());
121+
return keyPairGenerator;
120122
}
121123
catch (AssertionError e)
122124
{
@@ -159,6 +161,6 @@ private static ASN1ObjectIdentifier getAlgorithmOID(String kemName)
159161
return NISTObjectIdentifiers.id_alg_ml_kem_1024;
160162
}
161163

162-
throw Exceptions.illegalArgumentException("unknown kem name " + kemName, null);
164+
throw new IllegalArgumentException("unknown kem name " + kemName);
163165
}
164166
}

0 commit comments

Comments
 (0)