Skip to content

Commit

Permalink
More replacement of Kyber name with ML-KEM (sob...)
Browse files Browse the repository at this point in the history
  • Loading branch information
dghgit committed Aug 22, 2024
1 parent 22a9e71 commit 2f9d0b7
Show file tree
Hide file tree
Showing 23 changed files with 117 additions and 223 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
final class CBD
{

public static void kyberCBD(Poly r, byte[] bytes, int eta)
public static void mlkemCBD(Poly r, byte[] bytes, int eta)
{
long t, d;
int a, b;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package org.bouncycastle.pqc.crypto.mlkem;

import org.bouncycastle.util.Arrays;

import java.security.SecureRandom;

import org.bouncycastle.util.Arrays;

class MLKEMEngine
{
private SecureRandom random;
Expand Down Expand Up @@ -136,7 +136,7 @@ public int getKyberEta1()
return KyberEta1;
}

public MLKEMEngine(int k, boolean usingAes)
public MLKEMEngine(int k)
{
this.KyberK = k;
switch (k)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ public class MLKEMKeyGenerationParameters

public MLKEMKeyGenerationParameters(
SecureRandom random,
MLKEMParameters kyberParameters)
MLKEMParameters mlkemParameters)
{
super(random, 256);
this.params = kyberParameters;
this.params = mlkemParameters;
}

public MLKEMParameters getParameters()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,28 @@
public class MLKEMKeyPairGenerator
implements AsymmetricCipherKeyPairGenerator
{
private MLKEMParameters kyberParams;
private MLKEMParameters mlkemParams;

private SecureRandom random;

private void initialize(
KeyGenerationParameters param)
{
this.kyberParams = ((MLKEMKeyGenerationParameters)param).getParameters();
this.mlkemParams = ((MLKEMKeyGenerationParameters)param).getParameters();
this.random = param.getRandom();

}

private AsymmetricCipherKeyPair genKeyPair()
{
MLKEMEngine engine = kyberParams.getEngine();
MLKEMEngine engine = mlkemParams.getEngine();

engine.init(random);

byte[][] keyPair = engine.generateKemKeyPair();

MLKEMPublicKeyParameters pubKey = new MLKEMPublicKeyParameters(kyberParams, keyPair[0], keyPair[1]);
MLKEMPrivateKeyParameters privKey = new MLKEMPrivateKeyParameters(kyberParams, keyPair[2], keyPair[3], keyPair[4], keyPair[0], keyPair[1]);
MLKEMPublicKeyParameters pubKey = new MLKEMPublicKeyParameters(mlkemParams, keyPair[0], keyPair[1]);
MLKEMPrivateKeyParameters privKey = new MLKEMPrivateKeyParameters(mlkemParams, keyPair[2], keyPair[3], keyPair[4], keyPair[0], keyPair[1]);

return new AsymmetricCipherKeyPair(pubKey, privKey);
}
Expand All @@ -47,10 +47,10 @@ public AsymmetricCipherKeyPair generateKeyPair()

public AsymmetricCipherKeyPair internalGenerateKeyPair(byte[] d, byte[] z)
{
byte[][] keyPair = kyberParams.getEngine().generateKemKeyPairInternal(d, z);
byte[][] keyPair = mlkemParams.getEngine().generateKemKeyPairInternal(d, z);

MLKEMPublicKeyParameters pubKey = new MLKEMPublicKeyParameters(kyberParams, keyPair[0], keyPair[1]);
MLKEMPrivateKeyParameters privKey = new MLKEMPrivateKeyParameters(kyberParams, keyPair[2], keyPair[3], keyPair[4], keyPair[0], keyPair[1]);
MLKEMPublicKeyParameters pubKey = new MLKEMPublicKeyParameters(mlkemParams, keyPair[0], keyPair[1]);
MLKEMPrivateKeyParameters privKey = new MLKEMPrivateKeyParameters(mlkemParams, keyPair[2], keyPair[3], keyPair[4], keyPair[0], keyPair[1]);

return new AsymmetricCipherKeyPair(pubKey, privKey);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,19 @@
public class MLKEMParameters
implements KEMParameters
{
public static final MLKEMParameters kyber512 = new MLKEMParameters("kyber512", 2, 256, false);
public static final MLKEMParameters kyber768 = new MLKEMParameters("kyber768", 3, 256, false);
public static final MLKEMParameters kyber1024 = new MLKEMParameters("kyber1024", 4, 256, false);
public static final MLKEMParameters ml_kem_512 = new MLKEMParameters("ML-KEM-512", 2, 256);
public static final MLKEMParameters ml_kem_768 = new MLKEMParameters("ML-KEM-768", 3, 256);
public static final MLKEMParameters ml_kem_1024 = new MLKEMParameters("ML-KEM-1024", 4, 256);

private final String name;
private final int k;
private final int sessionKeySize;

/**
* @deprecated
* obsolete to be removed
*/
private final boolean usingAes;

private MLKEMParameters(String name, int k, int sessionKeySize, boolean usingAes)
private MLKEMParameters(String name, int k, int sessionKeySize)
{
this.name = name;
this.k = k;
this.sessionKeySize = sessionKeySize;
this.usingAes = usingAes;
}

public String getName()
Expand All @@ -34,7 +27,7 @@ public String getName()

public MLKEMEngine getEngine()
{
return new MLKEMEngine(k, usingAes);
return new MLKEMEngine(k);
}

public int getSessionKeySize()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,6 @@ public byte[] getNonce()
return Arrays.clone(nonce);
}

/** @deprecated Use {@link #getEncoded()} instead. */
public byte[] getPrivateKey()
{
return getEncoded();
}

public byte[] getPublicKey()
{
return MLKEMPublicKeyParameters.getEncoded(t, rho);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,6 @@ public byte[] getEncoded()
return getEncoded(t, rho);
}

/** @deprecated Use {@link #getEncoded()} instead. */
public byte[] getPublicKey()
{
return getEncoded();
}

public byte[] getRho()
{
return Arrays.clone(rho);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -316,14 +316,14 @@ public void getEta1Noise(byte[] seed, byte nonce)
{
byte[] buf = new byte[MLKEMEngine.KyberN * eta1 / 4];
symmetric.prf(buf, seed, nonce);
CBD.kyberCBD(this, buf, eta1);
CBD.mlkemCBD(this, buf, eta1);
}

public void getEta2Noise(byte[] seed, byte nonce)
{
byte[] buf = new byte[MLKEMEngine.KyberN * eta2 / 4];
symmetric.prf(buf, seed, nonce);
CBD.kyberCBD(this, buf, eta2);
CBD.mlkemCBD(this, buf, eta2);
}

public void polySubtract(Poly b)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,7 @@
package org.bouncycastle.pqc.crypto.mlkem;

import org.bouncycastle.crypto.ExtendedDigest;
import org.bouncycastle.crypto.StreamCipher;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.crypto.digests.SHA3Digest;
import org.bouncycastle.crypto.digests.SHA512Digest;
import org.bouncycastle.crypto.digests.SHAKEDigest;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.SICBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;

abstract class Symmetric
{
Expand Down Expand Up @@ -99,85 +91,4 @@ void kdf(byte[] out, byte[] in)
shakeDigest.doFinal(out, 0, out.length);
}
}

/**
* @deprecated
* obsolete to be removed
*/
@Deprecated
static class AesSymmetric
extends Symmetric
{
private final SHA256Digest sha256Digest;
private final SHA512Digest sha512Digest;
private final StreamCipher cipher;

AesSymmetric()
{
super(64);
this.sha256Digest = new SHA256Digest();
this.sha512Digest = new SHA512Digest();
this.cipher = SICBlockCipher.newInstance(AESEngine.newInstance());
}

private void doDigest(ExtendedDigest digest, byte[] out, byte[] in, int outOffset)
{
digest.update(in, 0, in.length);
digest.doFinal(out, outOffset);
}

private void aes128(byte[] out, int offset, int size)
{
byte[] buf = new byte[size]; // TODO: there might be a more efficient way of doing this...
cipher.processBytes(buf, 0, size, out, offset);
}

@Override
void hash_h(byte[] out, byte[] in, int outOffset)
{
doDigest(sha256Digest, out, in, outOffset);
}

@Override
void hash_g(byte[] out, byte[] in)
{
doDigest(sha512Digest, out, in, 0);
}

@Override
void xofAbsorb(byte[] key, byte x, byte y)
{
byte[] expnonce = new byte[12];
expnonce[0] = x;
expnonce[1] = y;

ParametersWithIV kp = new ParametersWithIV(new KeyParameter(key, 0, 32), expnonce);
cipher.init(true, kp);
}

@Override
void xofSqueezeBlocks(byte[] out, int outOffset, int outLen)
{
aes128(out, outOffset, outLen);
}

@Override
void prf(byte[] out, byte[] key, byte nonce)
{
byte[] expnonce = new byte[12];
expnonce[0] = nonce;

ParametersWithIV kp = new ParametersWithIV(new KeyParameter(key, 0, 32), expnonce);
cipher.init(true, kp);
aes128(out, 0, out.length);
}

@Override
void kdf(byte[] out, byte[] in)
{
byte[] buf = new byte[32];
doDigest(sha256Digest, buf, in, 0);
System.arraycopy(buf, 0, out, 0, out.length);
}
}
}
14 changes: 7 additions & 7 deletions core/src/main/java/org/bouncycastle/pqc/crypto/util/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@
import org.bouncycastle.pqc.crypto.bike.BIKEParameters;
import org.bouncycastle.pqc.crypto.cmce.CMCEParameters;
import org.bouncycastle.pqc.crypto.crystals.dilithium.DilithiumParameters;
import org.bouncycastle.pqc.crypto.mlkem.MLKEMParameters;
import org.bouncycastle.pqc.crypto.falcon.FalconParameters;
import org.bouncycastle.pqc.crypto.frodo.FrodoParameters;
import org.bouncycastle.pqc.crypto.hqc.HQCParameters;
import org.bouncycastle.pqc.crypto.mlkem.MLKEMParameters;
import org.bouncycastle.pqc.crypto.ntru.NTRUParameters;
import org.bouncycastle.pqc.crypto.ntruprime.NTRULPRimeParameters;
import org.bouncycastle.pqc.crypto.ntruprime.SNTRUPrimeParameters;
Expand Down Expand Up @@ -220,13 +220,13 @@ class Utils
falconParams.put(BCObjectIdentifiers.falcon_512, FalconParameters.falcon_512);
falconParams.put(BCObjectIdentifiers.falcon_1024, FalconParameters.falcon_1024);

kyberOids.put(MLKEMParameters.kyber512, NISTObjectIdentifiers.id_alg_ml_kem_512);
kyberOids.put(MLKEMParameters.kyber768, NISTObjectIdentifiers.id_alg_ml_kem_768);
kyberOids.put(MLKEMParameters.kyber1024,NISTObjectIdentifiers.id_alg_ml_kem_1024);
kyberOids.put(MLKEMParameters.ml_kem_512, NISTObjectIdentifiers.id_alg_ml_kem_512);
kyberOids.put(MLKEMParameters.ml_kem_768, NISTObjectIdentifiers.id_alg_ml_kem_768);
kyberOids.put(MLKEMParameters.ml_kem_1024,NISTObjectIdentifiers.id_alg_ml_kem_1024);

kyberParams.put(NISTObjectIdentifiers.id_alg_ml_kem_512, MLKEMParameters.kyber512);
kyberParams.put(NISTObjectIdentifiers.id_alg_ml_kem_768, MLKEMParameters.kyber768);
kyberParams.put(NISTObjectIdentifiers.id_alg_ml_kem_1024, MLKEMParameters.kyber1024);
kyberParams.put(NISTObjectIdentifiers.id_alg_ml_kem_512, MLKEMParameters.ml_kem_512);
kyberParams.put(NISTObjectIdentifiers.id_alg_ml_kem_768, MLKEMParameters.ml_kem_768);
kyberParams.put(NISTObjectIdentifiers.id_alg_ml_kem_1024, MLKEMParameters.ml_kem_1024);

ntruprimeOids.put(NTRULPRimeParameters.ntrulpr653, BCObjectIdentifiers.ntrulpr653);
ntruprimeOids.put(NTRULPRimeParameters.ntrulpr761, BCObjectIdentifiers.ntrulpr761);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ private AsymmetricCipherKeyPair genKeyPair()
{
MLKEMKeyPairGenerator kyberKeyGen = new MLKEMKeyPairGenerator();

kyberKeyGen.init(new MLKEMKeyGenerationParameters(random, MLKEMParameters.kyber768));
kyberKeyGen.init(new MLKEMKeyGenerationParameters(random, MLKEMParameters.ml_kem_768));

X25519KeyPairGenerator x25519KeyGen = new X25519KeyPairGenerator();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public XWingPrivateKeyParameters(byte[] encoding)
{
super(false);

this.kybPriv = new MLKEMPrivateKeyParameters(MLKEMParameters.kyber768, Arrays.copyOfRange(encoding, 0, encoding.length - X25519PrivateKeyParameters.KEY_SIZE));
this.kybPriv = new MLKEMPrivateKeyParameters(MLKEMParameters.ml_kem_768, Arrays.copyOfRange(encoding, 0, encoding.length - X25519PrivateKeyParameters.KEY_SIZE));
this.xdhPriv = new X25519PrivateKeyParameters(encoding, encoding.length - X25519PrivateKeyParameters.KEY_SIZE);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public XWingPublicKeyParameters(byte[] encoding)
{
super(false);

this.kybPub = new MLKEMPublicKeyParameters(MLKEMParameters.kyber768, Arrays.copyOfRange(encoding, 0, encoding.length - X25519PublicKeyParameters.KEY_SIZE));
this.kybPub = new MLKEMPublicKeyParameters(MLKEMParameters.ml_kem_768, Arrays.copyOfRange(encoding, 0, encoding.length - X25519PublicKeyParameters.KEY_SIZE));
this.xdhPub = new X25519PublicKeyParameters(encoding, encoding.length - X25519PublicKeyParameters.KEY_SIZE);
}

Expand Down
Loading

0 comments on commit 2f9d0b7

Please sign in to comment.