22
33import org .bouncycastle .crypto .AsymmetricCipherKeyPair ;
44import org .bouncycastle .crypto .SecretWithEncapsulation ;
5+ import org .bouncycastle .jcajce .SecretKeyWithEncapsulation ;
6+ import org .bouncycastle .jcajce .provider .asymmetric .mlkem .BCMLKEMPrivateKey ;
7+ import org .bouncycastle .jcajce .provider .asymmetric .mlkem .BCMLKEMPublicKey ;
8+ import org .bouncycastle .jcajce .spec .KEMExtractSpec ;
9+ import org .bouncycastle .jcajce .spec .KEMGenerateSpec ;
10+ import org .bouncycastle .jcajce .spec .KEMParameterSpec ;
11+ import org .bouncycastle .jcajce .spec .KTSParameterSpec ;
12+ import org .bouncycastle .jcajce .spec .MLKEMParameterSpec ;
513import org .bouncycastle .pqc .crypto .mlkem .MLKEMExtractor ;
614import org .bouncycastle .pqc .crypto .mlkem .MLKEMGenerator ;
715import org .bouncycastle .pqc .crypto .mlkem .MLKEMKeyGenerationParameters ;
8- import org .bouncycastle .pqc .crypto .mlkem .MLKEMKeyPairGenerator ;
916import org .bouncycastle .pqc .crypto .mlkem .MLKEMParameters ;
1017import org .bouncycastle .pqc .crypto .mlkem .MLKEMPrivateKeyParameters ;
1118import org .bouncycastle .pqc .crypto .mlkem .MLKEMPublicKeyParameters ;
1219import org .bouncycastle .tls .NamedGroup ;
1320import org .bouncycastle .tls .crypto .TlsAgreement ;
1421import org .bouncycastle .tls .crypto .TlsKemConfig ;
1522import org .bouncycastle .tls .crypto .TlsKemDomain ;
23+ import org .bouncycastle .util .encoders .Hex ;
24+
25+ import javax .crypto .Cipher ;
26+ import javax .crypto .KeyGenerator ;
27+ import javax .crypto .spec .SecretKeySpec ;
28+ import java .nio .charset .StandardCharsets ;
29+ import java .security .AlgorithmParameters ;
30+ import java .security .GeneralSecurityException ;
31+ import java .security .InvalidAlgorithmParameterException ;
32+ import java .security .Key ;
33+ import java .security .KeyPair ;
34+ import java .security .KeyPairGenerator ;
35+ import java .security .NoSuchAlgorithmException ;
36+ import java .security .NoSuchProviderException ;
37+ import java .security .PrivateKey ;
38+ import java .security .PublicKey ;
39+ import java .security .SecureRandom ;
1640
1741public class JceTlsMLKemDomain implements TlsKemDomain
1842{
@@ -38,13 +62,29 @@ public static MLKEMParameters getDomainParameters(TlsKemConfig kemConfig)
3862 protected final TlsKemConfig config ;
3963 protected final MLKEMParameters domainParameters ;
4064 protected final boolean isServer ;
65+ protected KeyGenerator keyGen ;
66+ // protected KeyPairGenerator kpg;
67+ // protected Cipher cipher;
68+
4169
4270 public JceTlsMLKemDomain (JcaTlsCrypto crypto , TlsKemConfig kemConfig )
4371 {
4472 this .crypto = crypto ;
4573 this .config = kemConfig ;
4674 this .domainParameters = getDomainParameters (kemConfig );
4775 this .isServer = kemConfig .isServer ();
76+ try
77+ {
78+ this .keyGen = keyGen = crypto .getHelper ().createKeyGenerator (domainParameters .getName ());
79+ }
80+ catch (NoSuchAlgorithmException e )
81+ {
82+ throw new RuntimeException (e );
83+ }
84+ catch (NoSuchProviderException e )
85+ {
86+ throw new RuntimeException (e );
87+ }
4888 }
4989
5090 public JceTlsSecret adoptLocalSecret (byte [] secret )
@@ -57,34 +97,89 @@ public TlsAgreement createKem()
5797 return new JceTlsMLKem (this );
5898 }
5999
60- public JceTlsSecret decapsulate (MLKEMPrivateKeyParameters privateKey , byte [] ciphertext )
100+ public JceTlsSecret decapsulate (PrivateKey privateKey , byte [] ciphertext )
61101 {
62- MLKEMExtractor kemExtract = new MLKEMExtractor (privateKey );
63- byte [] secret = kemExtract .extractSecret (ciphertext );
64- return adoptLocalSecret (secret );
102+ try
103+ {
104+ keyGen .init (new KEMExtractSpec .Builder (privateKey , ciphertext , "DEF" , 256 ).withNoKdf ().build ());
105+ SecretKeyWithEncapsulation secEnc = (SecretKeyWithEncapsulation )keyGen .generateKey ();
106+
107+ return adoptLocalSecret (secEnc .getEncoded ());
108+ }
109+ catch (Exception e )
110+ {
111+ throw Exceptions .illegalArgumentException ("invalid key: " + e .getMessage (), e );
112+ }
113+
114+
115+ // MLKEMExtractor kemExtract = new MLKEMExtractor(privateKey);
116+ // byte[] secret = kemExtract.extractSecret(ciphertext);
117+ // return adoptLocalSecret(secret);
65118 }
66119
67- public MLKEMPublicKeyParameters decodePublicKey (byte [] encoding )
120+ public BCMLKEMPublicKey decodePublicKey (byte [] encoding )
68121 {
69- return new MLKEMPublicKeyParameters (domainParameters , encoding );
122+ return new BCMLKEMPublicKey ( new MLKEMPublicKeyParameters (domainParameters , encoding ) );
70123 }
71124
72- public SecretWithEncapsulation encapsulate (MLKEMPublicKeyParameters publicKey )
125+ public SecretKeyWithEncapsulation encapsulate (PublicKey publicKey )
73126 {
74- MLKEMGenerator kemGen = new MLKEMGenerator (crypto .getSecureRandom ());
75- return kemGen .generateEncapsulated (publicKey );
127+ try
128+ {
129+ keyGen .init (new KEMGenerateSpec .Builder (publicKey , "DEF" , 256 ).withNoKdf ().build ());
130+ return (SecretKeyWithEncapsulation )keyGen .generateKey ();
131+ }
132+ catch (Exception e )
133+ {
134+ throw Exceptions .illegalArgumentException ("invalid key: " + e .getMessage (), e );
135+ }
76136 }
77137
78138 public byte [] encodePublicKey (MLKEMPublicKeyParameters publicKey )
79139 {
80140 return publicKey .getEncoded ();
81141 }
82142
83- public AsymmetricCipherKeyPair generateKeyPair ()
143+ private void init ()
144+ {
145+ // try
146+ // {
147+ //// kpg = KeyPairGenerator.getInstance("MLKEM");
148+ //// kpg.initialize(MLKEMParameterSpec.fromName(domainParameters.getName()), crypto.getSecureRandom());
149+ //// keyGen = KeyGenerator.getInstance(domainParameters.getName(), "BC");
150+ //
151+ //// cipher = KemUtil.getCipher(crypto, domainParameters.getName());
152+ //
153+ //
154+ // }
155+ // catch (GeneralSecurityException e)
156+ // {
157+ // throw Exceptions.illegalStateException("unable to create key pair: " + e.getMessage(), e);
158+ // }
159+
160+
161+ }
162+ public KeyPair generateKeyPair ()
84163 {
85- MLKEMKeyPairGenerator keyPairGenerator = new MLKEMKeyPairGenerator ();
86- keyPairGenerator .init (new MLKEMKeyGenerationParameters (crypto .getSecureRandom (), domainParameters ));
87- return keyPairGenerator .generateKeyPair ();
164+ // AlgorithmParameters params = KemUtil.getAlgorithmParameters(crypto, domainParameters.getName());
165+ // if (params == null)
166+ // {
167+ // throw new IllegalStateException("KEM parameters unavailable");
168+ // }
169+ KeyPairGenerator kpg = null ;
170+ try
171+ {
172+ kpg = crypto .getHelper ().createKeyPairGenerator (domainParameters .getName ());
173+ }
174+ catch (NoSuchAlgorithmException e )
175+ {
176+ throw new RuntimeException (e );
177+ }
178+ catch (NoSuchProviderException e )
179+ {
180+ throw new RuntimeException (e );
181+ }
182+ return kpg .generateKeyPair ();
88183 }
89184
90185 public boolean isServer ()
0 commit comments