Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions crypto/src/pqc/crypto/cmce/CmceKeyGenerationParameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,24 @@

namespace Org.BouncyCastle.Pqc.Crypto.Cmce
{
/// <summary>
/// Key generation parameters for Classic McEliece, binding a randomness source to a parameter set.
/// </summary>
public sealed class CmceKeyGenerationParameters
: KeyGenerationParameters
{
private CmceParameters parameters;

/// <summary>Creates key generation parameters for the given Classic McEliece parameter set.</summary>
/// <param name="random">The randomness source for key generation.</param>
/// <param name="CmceParams">The Classic McEliece parameter set to generate keys for.</param>
public CmceKeyGenerationParameters(SecureRandom random, CmceParameters CmceParams)
: base(random, 256)
{
this.parameters = CmceParams;
}

/// <summary>The Classic McEliece parameter set keys will be generated for.</summary>
public CmceParameters Parameters => parameters;
}
}
2 changes: 2 additions & 0 deletions crypto/src/pqc/crypto/cmce/CmceKeyParameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Org.BouncyCastle.Pqc.Crypto.Cmce
{
/// <summary>Base class for Classic McEliece public and private keys, carrying the parameter set.</summary>
public abstract class CmceKeyParameters
: AsymmetricKeyParameter
{
Expand All @@ -13,6 +14,7 @@ internal CmceKeyParameters(bool isPrivate, CmceParameters parameters)
this.parameters = parameters;
}

/// <summary>The Classic McEliece parameter set this key belongs to.</summary>
public CmceParameters Parameters => parameters;
}
}
21 changes: 21 additions & 0 deletions crypto/src/pqc/crypto/cmce/CmceParameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

namespace Org.BouncyCastle.Pqc.Crypto.Cmce
{
/// <summary>
/// Classic McEliece code-based KEM parameter sets. The <c>f</c> variants use the semi-systematic ("fast")
/// matrix-reduction form, which speeds up key generation without changing the key format.
/// </summary>
public sealed class CmceParameters
: ICipherParameters
{
Expand All @@ -13,33 +17,43 @@ public sealed class CmceParameters
private static readonly int[] poly6960 = new int[] {8, 0};
private static readonly int[] poly8192 = new int[] {7, 2, 1, 0};

/// <summary>mceliece348864 parameter set (128-bit security).</summary>
public static readonly CmceParameters mceliece348864r3 =
new CmceParameters("mceliece348864", 12, 3488, 64, poly3488, false, 128);

/// <summary>mceliece348864f parameter set (128-bit security, fast key generation).</summary>
public static readonly CmceParameters mceliece348864fr3 =
new CmceParameters("mceliece348864f", 12, 3488, 64, poly3488, true, 128);

/// <summary>mceliece460896 parameter set (192-bit security).</summary>
public static readonly CmceParameters mceliece460896r3 =
new CmceParameters("mceliece460896", 13, 4608, 96, poly4608, false, 192);

/// <summary>mceliece460896f parameter set (192-bit security, fast key generation).</summary>
public static readonly CmceParameters mceliece460896fr3 =
new CmceParameters("mceliece460896f", 13, 4608, 96, poly4608, true, 192);

/// <summary>mceliece6688128 parameter set (256-bit security).</summary>
public static readonly CmceParameters mceliece6688128r3 =
new CmceParameters("mceliece6688128", 13, 6688, 128, poly6688, false, 256);

/// <summary>mceliece6688128f parameter set (256-bit security, fast key generation).</summary>
public static readonly CmceParameters mceliece6688128fr3 =
new CmceParameters("mceliece6688128f", 13, 6688, 128, poly6688, true, 256);

/// <summary>mceliece6960119 parameter set (256-bit security).</summary>
public static readonly CmceParameters mceliece6960119r3 =
new CmceParameters("mceliece6960119", 13, 6960, 119, poly6960, false, 256);

/// <summary>mceliece6960119f parameter set (256-bit security, fast key generation).</summary>
public static readonly CmceParameters mceliece6960119fr3 =
new CmceParameters("mceliece6960119f", 13, 6960, 119, poly6960, true, 256);

/// <summary>mceliece8192128 parameter set (256-bit security).</summary>
public static readonly CmceParameters mceliece8192128r3 =
new CmceParameters("mceliece8192128", 13, 8192, 128, poly8192, false, 256);

/// <summary>mceliece8192128f parameter set (256-bit security, fast key generation).</summary>
public static readonly CmceParameters mceliece8192128fr3 =
new CmceParameters("mceliece8192128f", 13, 8192, 128, poly8192, true, 256);

Expand Down Expand Up @@ -75,18 +89,25 @@ private CmceParameters(string name, int m, int n, int t, int[] p, bool usePivots
}
}

/// <summary>The name of this parameter set.</summary>
public string Name => name;

/// <summary>The field extension degree <c>m</c> (<c>GF(2^m)</c>).</summary>
public int M => m;

/// <summary>The code length <c>n</c>.</summary>
public int N => n;

/// <summary>The number of errors / Goppa polynomial degree <c>t</c>.</summary>
public int T => t;

/// <summary>The semi-systematic parameter <c>mu</c> (non-zero only for the fast variants).</summary>
public int Mu => usePivots ? 32 : 0;

/// <summary>The semi-systematic parameter <c>nu</c> (non-zero only for the fast variants).</summary>
public int Nu => usePivots ? 64 : 0;

/// <summary>The default session key size, in bits.</summary>
public int DefaultKeySize => defaultKeySize;

internal ICmceEngine Engine => engine;
Expand Down
14 changes: 14 additions & 0 deletions crypto/src/pqc/crypto/cmce/CmcePrivateKeyParameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,34 @@

namespace Org.BouncyCastle.Pqc.Crypto.Cmce
{
/// <summary>A Classic McEliece private (decapsulation) key, represented by its raw byte encoding.</summary>
public sealed class CmcePrivateKeyParameters
: CmceKeyParameters
{
internal readonly byte[] privateKey;

/// <summary>Returns a copy of the raw private key bytes.</summary>
public byte[] GetPrivateKey()
{
return Arrays.Clone(privateKey);
}

/// <summary>Creates a Classic McEliece private key from its raw encoding.</summary>
/// <param name="parameters">The Classic McEliece parameter set this key belongs to.</param>
/// <param name="privateKey">The raw private key bytes; a defensive copy is taken.</param>
public CmcePrivateKeyParameters(CmceParameters parameters, byte[] privateKey)
: base(true, parameters)
{
this.privateKey = Arrays.Clone(privateKey);
}

/// <summary>Creates a Classic McEliece private key from its component fields.</summary>
/// <param name="parameters">The Classic McEliece parameter set this key belongs to.</param>
/// <param name="delta">The delta component.</param>
/// <param name="C">The C component.</param>
/// <param name="g">The Goppa polynomial component.</param>
/// <param name="alpha">The field-ordering component.</param>
/// <param name="s">The s component.</param>
public CmcePrivateKeyParameters(CmceParameters parameters, byte[] delta, byte[] C, byte[] g, byte[] alpha,
byte[] s)
: base(true, parameters)
Expand All @@ -39,8 +51,10 @@ public CmcePrivateKeyParameters(CmceParameters parameters, byte[] delta, byte[]

}

/// <summary>Reconstructs the matching public key from this private key.</summary>
public byte[] ReconstructPublicKey() => Parameters.Engine.GeneratePublicKeyFromPrivateKey(privateKey);

/// <summary>Returns a copy of the raw private key encoding.</summary>
public byte[] GetEncoded()
{
return Arrays.Clone(privateKey);
Expand Down
8 changes: 7 additions & 1 deletion crypto/src/pqc/crypto/cmce/CmcePublicKeyParameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,28 @@

namespace Org.BouncyCastle.Pqc.Crypto.Cmce
{
/// <summary>A Classic McEliece public (encapsulation) key, represented by its raw byte encoding.</summary>
public sealed class CmcePublicKeyParameters
: CmceKeyParameters
{
internal readonly byte[] publicKey;

/// <summary>Creates a Classic McEliece public key from its raw encoding.</summary>
/// <param name="parameters">The Classic McEliece parameter set this key belongs to.</param>
/// <param name="publicKey">The raw public key bytes; a defensive copy is taken.</param>
public CmcePublicKeyParameters(CmceParameters parameters, byte[] publicKey)
: base(false, parameters)
{
this.publicKey = Arrays.Clone(publicKey);
}

/// <summary>Returns a copy of the raw public key bytes.</summary>
public byte[] GetPublicKey()
{
{
return Arrays.Clone(publicKey);
}

/// <summary>Returns a copy of the raw public key encoding.</summary>
public byte[] GetEncoded()
{
return GetPublicKey();
Expand Down