11package org .bouncycastle .tls .crypto .impl .jcajce ;
22
3+ import java .io .IOException ;
34import java .security .KeyPair ;
45import java .security .KeyPairGenerator ;
5- import java .security .NoSuchAlgorithmException ;
6- import java .security .NoSuchProviderException ;
76import java .security .PrivateKey ;
87import java .security .PublicKey ;
98
109import javax .crypto .KeyGenerator ;
1110
1211import org .bouncycastle .jcajce .SecretKeyWithEncapsulation ;
13- import org .bouncycastle .jcajce .provider .asymmetric .mlkem .BCMLKEMPublicKey ;
1412import org .bouncycastle .jcajce .spec .KEMExtractSpec ;
1513import org .bouncycastle .jcajce .spec .KEMGenerateSpec ;
16- import org .bouncycastle .pqc .crypto .mlkem .MLKEMParameters ;
17- import org .bouncycastle .pqc .crypto .mlkem .MLKEMPublicKeyParameters ;
1814import org .bouncycastle .tls .NamedGroup ;
1915import org .bouncycastle .tls .crypto .TlsAgreement ;
2016import org .bouncycastle .tls .crypto .TlsKemConfig ;
2117import org .bouncycastle .tls .crypto .TlsKemDomain ;
2218
2319public class JceTlsMLKemDomain implements TlsKemDomain
2420{
25- public static MLKEMParameters getDomainParameters (TlsKemConfig kemConfig )
26- {
27- switch (kemConfig .getNamedGroup ())
28- {
29- case NamedGroup .OQS_mlkem512 :
30- case NamedGroup .MLKEM512 :
31- return MLKEMParameters .ml_kem_512 ;
32- case NamedGroup .OQS_mlkem768 :
33- case NamedGroup .MLKEM768 :
34- return MLKEMParameters .ml_kem_768 ;
35- case NamedGroup .OQS_mlkem1024 :
36- case NamedGroup .MLKEM1024 :
37- return MLKEMParameters .ml_kem_1024 ;
38- default :
39- throw new IllegalArgumentException ("No ML-KEM configuration provided" );
40- }
41- }
42-
4321 protected final JcaTlsCrypto crypto ;
44- protected final TlsKemConfig config ;
45- protected final MLKEMParameters domainParameters ;
22+ protected final String kemName ;
4623 protected final boolean isServer ;
47- protected KeyGenerator keyGen ;
48- // protected KeyPairGenerator kpg;
49- // protected Cipher cipher;
50-
5124
5225 public JceTlsMLKemDomain (JcaTlsCrypto crypto , TlsKemConfig kemConfig )
5326 {
5427 this .crypto = crypto ;
55- this .config = kemConfig ;
56- this .domainParameters = getDomainParameters (kemConfig );
28+ this .kemName = NamedGroup .getKemName (kemConfig .getNamedGroup ());
5729 this .isServer = kemConfig .isServer ();
58- try
59- {
60- this .keyGen = crypto .getHelper ().createKeyGenerator (domainParameters .getName ());
61- }
62- catch (NoSuchAlgorithmException e )
63- {
64- throw new RuntimeException (e );
65- }
66- catch (NoSuchProviderException e )
67- {
68- throw new RuntimeException (e );
69- }
7030 }
7131
7232 public JceTlsSecret adoptLocalSecret (byte [] secret )
@@ -83,85 +43,59 @@ public JceTlsSecret decapsulate(PrivateKey privateKey, byte[] ciphertext)
8343 {
8444 try
8545 {
86- keyGen . init ( new KEMExtractSpec . Builder ( privateKey , ciphertext , "DEF" , 256 ). withNoKdf (). build () );
87- SecretKeyWithEncapsulation secEnc = ( SecretKeyWithEncapsulation ) keyGen . generateKey ( );
88-
46+ KeyGenerator keyGenerator = KemUtil . getKeyGenerator ( crypto , kemName );
47+ keyGenerator . init ( new KEMExtractSpec . Builder ( privateKey , ciphertext , "DEF" , 256 ). withNoKdf (). build () );
48+ SecretKeyWithEncapsulation secEnc = ( SecretKeyWithEncapsulation ) keyGenerator . generateKey ();
8949 return adoptLocalSecret (secEnc .getEncoded ());
9050 }
9151 catch (Exception e )
9252 {
9353 throw Exceptions .illegalArgumentException ("invalid key: " + e .getMessage (), e );
9454 }
95-
96-
97- // MLKEMExtractor kemExtract = new MLKEMExtractor(privateKey);
98- // byte[] secret = kemExtract.extractSecret(ciphertext);
99- // return adoptLocalSecret(secret);
10055 }
10156
102- public BCMLKEMPublicKey decodePublicKey (byte [] encoding )
57+ public PublicKey decodePublicKey (byte [] encoding )
58+ throws IOException
10359 {
104- return new BCMLKEMPublicKey ( new MLKEMPublicKeyParameters ( domainParameters , encoding ) );
60+ return KemUtil . decodePublicKey ( crypto , kemName , encoding );
10561 }
10662
10763 public SecretKeyWithEncapsulation encapsulate (PublicKey publicKey )
10864 {
10965 try
11066 {
111- keyGen .init (new KEMGenerateSpec .Builder (publicKey , "DEF" , 256 ).withNoKdf ().build ());
112- return (SecretKeyWithEncapsulation )keyGen .generateKey ();
67+ KeyGenerator keyGenerator = KemUtil .getKeyGenerator (crypto , kemName );
68+ keyGenerator .init (new KEMGenerateSpec .Builder (publicKey , "DEF" , 256 ).withNoKdf ().build ());
69+ return (SecretKeyWithEncapsulation )keyGenerator .generateKey ();
11370 }
11471 catch (Exception e )
11572 {
11673 throw Exceptions .illegalArgumentException ("invalid key: " + e .getMessage (), e );
11774 }
11875 }
11976
120- public byte [] encodePublicKey (MLKEMPublicKeyParameters publicKey )
77+ public byte [] encodePublicKey (PublicKey publicKey )
78+ throws IOException
12179 {
122- return publicKey . getEncoded ( );
80+ return KemUtil . encodePublicKey ( publicKey );
12381 }
12482
125- private void init ()
83+ public KeyPair generateKeyPair ()
12684 {
85+ // TODO How to pass only the SecureRandom?
12786// try
12887// {
129- //// kpg = KeyPairGenerator.getInstance("MLKEM");
130- //// kpg.initialize(MLKEMParameterSpec.fromName(domainParameters.getName()), crypto.getSecureRandom());
131- //// keyGen = KeyGenerator.getInstance(domainParameters.getName(), "BC");
132- //
133- //// cipher = KemUtil.getCipher(crypto, domainParameters.getName());
134- //
135- //
88+ // KeyPairGenerator keyPairGenerator = KemUtil.getKeyPairGenerator(crypto, kemName);
89+ // keyPairGenerator.initialize((AlgorithmParameterSpec)null, crypto.getSecureRandom());
90+ // return keyPairGenerator.generateKeyPair();
13691// }
13792// catch (GeneralSecurityException e)
13893// {
13994// throw Exceptions.illegalStateException("unable to create key pair: " + e.getMessage(), e);
14095// }
14196
142-
143- }
144- public KeyPair generateKeyPair ()
145- {
146- // AlgorithmParameters params = KemUtil.getAlgorithmParameters(crypto, domainParameters.getName());
147- // if (params == null)
148- // {
149- // throw new IllegalStateException("KEM parameters unavailable");
150- // }
151- KeyPairGenerator kpg = null ;
152- try
153- {
154- kpg = crypto .getHelper ().createKeyPairGenerator (domainParameters .getName ());
155- }
156- catch (NoSuchAlgorithmException e )
157- {
158- throw new RuntimeException (e );
159- }
160- catch (NoSuchProviderException e )
161- {
162- throw new RuntimeException (e );
163- }
164- return kpg .generateKeyPair ();
97+ KeyPairGenerator keyPairGenerator = KemUtil .getKeyPairGenerator (crypto , kemName );
98+ return keyPairGenerator .generateKeyPair ();
16599 }
166100
167101 public boolean isServer ()
0 commit comments