diff --git a/crypto/src/pqc/crypto/crystals/dilithium/DilithiumPrivateKeyParameters.cs b/crypto/src/pqc/crypto/crystals/dilithium/DilithiumPrivateKeyParameters.cs
index 66a518c93..cf18ce56e 100644
--- a/crypto/src/pqc/crypto/crystals/dilithium/DilithiumPrivateKeyParameters.cs
+++ b/crypto/src/pqc/crypto/crystals/dilithium/DilithiumPrivateKeyParameters.cs
@@ -27,6 +27,28 @@ namespace Org.BouncyCastle.Pqc.Crypto.Crystals.Dilithium
m_t1 = Arrays.Clone(t1);
}
+ public DilithiumPrivateKeyParameters(DilithiumParameters parameters, byte[] encoding, DilithiumPublicKeyParameters pubKey)
+ : base(true, parameters)
+ {
+ DilithiumEngine eng = parameters.GetEngine(null);
+
+ int index = 0;
+ m_rho = Arrays.CopyOfRange(encoding, 0, DilithiumEngine.SeedBytes); index += DilithiumEngine.SeedBytes;
+ m_k = Arrays.CopyOfRange(encoding, index, index + DilithiumEngine.SeedBytes); index += DilithiumEngine.SeedBytes;
+ m_tr = Arrays.CopyOfRange(encoding, index, index + DilithiumEngine.TrBytes); index += DilithiumEngine.TrBytes;
+ int delta = eng.L * eng.PolyEtaPackedBytes;
+ m_s1 = Arrays.CopyOfRange(encoding, index, index + delta); index += delta;
+ delta = eng.K * eng.PolyEtaPackedBytes;
+ m_s2 = Arrays.CopyOfRange(encoding, index, index + delta); index += delta;
+ delta = eng.K * DilithiumEngine.PolyT0PackedBytes;
+ m_t0 = Arrays.CopyOfRange(encoding, index, index + delta);
+
+ if (pubKey != null)
+ {
+ m_t1 = Arrays.Clone(pubKey.GetT1());
+ }
+ }
+
public byte[] GetEncoded() => Arrays.ConcatenateAll(m_rho, m_k, m_tr, m_s1, m_s2, m_t0);
public byte[] K => Arrays.Clone(m_k);
diff --git a/crypto/src/pqc/crypto/crystals/kyber/KyberPrivateKeyParameters.cs b/crypto/src/pqc/crypto/crystals/kyber/KyberPrivateKeyParameters.cs
index 08b4fbe86..594df1e05 100644
--- a/crypto/src/pqc/crypto/crystals/kyber/KyberPrivateKeyParameters.cs
+++ b/crypto/src/pqc/crypto/crystals/kyber/KyberPrivateKeyParameters.cs
@@ -22,6 +22,19 @@ namespace Org.BouncyCastle.Pqc.Crypto.Crystals.Kyber
m_rho = Arrays.Clone(rho);
}
+ public KyberPrivateKeyParameters(KyberParameters parameters, byte[] encoding)
+ : base(true, parameters)
+ {
+ KyberEngine eng = parameters.Engine;
+
+ int index = 0;
+ m_s = Arrays.CopyOfRange(encoding, 0, eng.IndCpaSecretKeyBytes); index += eng.IndCpaSecretKeyBytes;
+ m_t = Arrays.CopyOfRange(encoding, index, index + eng.IndCpaPublicKeyBytes - KyberEngine.SymBytes); index += eng.IndCpaPublicKeyBytes - KyberEngine.SymBytes;
+ m_rho = Arrays.CopyOfRange(encoding, index, index + 32); index += 32;
+ m_hpk = Arrays.CopyOfRange(encoding, index, index + 32); index += 32;
+ m_nonce = Arrays.CopyOfRange(encoding, index, index + KyberEngine.SymBytes);
+ }
+
public byte[] GetEncoded() => Arrays.ConcatenateAll(m_s, m_t, m_rho, m_hpk, m_nonce);
public byte[] GetHpk() => Arrays.Clone(m_hpk);
diff --git a/crypto/src/pqc/crypto/utils/PqcPrivateKeyFactory.cs b/crypto/src/pqc/crypto/utils/PqcPrivateKeyFactory.cs
index c1e3feb1b..8058ed695 100644
--- a/crypto/src/pqc/crypto/utils/PqcPrivateKeyFactory.cs
+++ b/crypto/src/pqc/crypto/utils/PqcPrivateKeyFactory.cs
@@ -138,54 +138,29 @@ namespace Org.BouncyCastle.Pqc.Crypto.Utilities
}
if (algOid.On(BCObjectIdentifiers.pqc_kem_kyber))
{
- KyberPrivateKey kyberKey = KyberPrivateKey.GetInstance(keyInfo.ParsePrivateKey());
+ Asn1OctetString kyberKey = Asn1OctetString.GetInstance(keyInfo.ParsePrivateKey());
KyberParameters kyberParams = PqcUtilities.KyberParamsLookup(algOid);
-
-#pragma warning disable CS0618 // Type or member is obsolete
- KyberPublicKey pubKey = kyberKey.PublicKey;
-#pragma warning restore CS0618 // Type or member is obsolete
- if (pubKey != null)
- {
- return new KyberPrivateKeyParameters(kyberParams, kyberKey.GetS(), kyberKey.GetHpk(),
- kyberKey.GetNonce(), pubKey.T, pubKey.Rho);
- }
- return new KyberPrivateKeyParameters(kyberParams, kyberKey.GetS(), kyberKey.GetHpk(),
- kyberKey.GetNonce(), null, null);
+
+ return new KyberPrivateKeyParameters(kyberParams, kyberKey.GetOctets());
}
if (algOid.Equals(BCObjectIdentifiers.dilithium2) ||
algOid.Equals(BCObjectIdentifiers.dilithium3) ||
- algOid.Equals(BCObjectIdentifiers.dilithium5) ||
- algOid.Equals(BCObjectIdentifiers.dilithium2_aes) ||
- algOid.Equals(BCObjectIdentifiers.dilithium3_aes) ||
- algOid.Equals(BCObjectIdentifiers.dilithium5_aes))
+ algOid.Equals(BCObjectIdentifiers.dilithium5))
{
- Asn1Sequence keyEnc = Asn1Sequence.GetInstance(keyInfo.ParsePrivateKey());
+ Asn1OctetString keyEnc = Asn1OctetString.GetInstance(keyInfo.ParsePrivateKey());
DilithiumParameters spParams = PqcUtilities.DilithiumParamsLookup(algOid);
- int version = DerInteger.GetInstance(keyEnc[0]).IntValueExact;
- if (version != 0)
- throw new IOException("unknown private key version: " + version);
-
- byte[] t1 = null;
-
DerBitString publicKeyData = keyInfo.PublicKey;
if (publicKeyData != null)
{
var pubParams = PqcPublicKeyFactory.DilithiumConverter.GetPublicKeyParameters(spParams,
publicKeyData);
- t1 = pubParams.GetT1();
+ return new DilithiumPrivateKeyParameters(spParams, keyEnc.GetOctets(), pubParams);
}
- return new DilithiumPrivateKeyParameters(spParams,
- DerBitString.GetInstance(keyEnc[1]).GetOctets(),
- DerBitString.GetInstance(keyEnc[2]).GetOctets(),
- DerBitString.GetInstance(keyEnc[3]).GetOctets(),
- DerBitString.GetInstance(keyEnc[4]).GetOctets(),
- DerBitString.GetInstance(keyEnc[5]).GetOctets(),
- DerBitString.GetInstance(keyEnc[6]).GetOctets(),
- t1); // encT1
+ return new DilithiumPrivateKeyParameters(spParams, keyEnc.GetOctets(), null);
}
if (algOid.Equals(BCObjectIdentifiers.falcon_512) ||
algOid.Equals(BCObjectIdentifiers.falcon_1024))
diff --git a/crypto/src/pqc/crypto/utils/PqcPrivateKeyInfoFactory.cs b/crypto/src/pqc/crypto/utils/PqcPrivateKeyInfoFactory.cs
index ad079d5c6..1895bf891 100644
--- a/crypto/src/pqc/crypto/utils/PqcPrivateKeyInfoFactory.cs
+++ b/crypto/src/pqc/crypto/utils/PqcPrivateKeyInfoFactory.cs
@@ -133,33 +133,17 @@ namespace Org.BouncyCastle.Pqc.Crypto.Utilities
{
AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(
PqcUtilities.KyberOidLookup(kyberPrivateKeyParameters.Parameters));
-
-#pragma warning disable CS0618 // Type or member is obsolete
- KyberPublicKey kyberPub = new KyberPublicKey(kyberPrivateKeyParameters.GetT(),
- kyberPrivateKeyParameters.GetRho());
-#pragma warning restore CS0618 // Type or member is obsolete
- KyberPrivateKey kyberPriv = new KyberPrivateKey(0, kyberPrivateKeyParameters.GetS(),
- kyberPrivateKeyParameters.GetHpk(), kyberPrivateKeyParameters.GetNonce(), kyberPub);
-
- return new PrivateKeyInfo(algorithmIdentifier, kyberPriv, attributes);
+
+ return new PrivateKeyInfo(algorithmIdentifier, new DerOctetString(kyberPrivateKeyParameters.GetEncoded()), attributes);
}
if (privateKey is DilithiumPrivateKeyParameters dilithiumPrivateKeyParameters)
{
- Asn1EncodableVector v = new Asn1EncodableVector(7);
- v.Add(new DerInteger(0));
- v.Add(new DerBitString(dilithiumPrivateKeyParameters.Rho));
- v.Add(new DerBitString(dilithiumPrivateKeyParameters.K));
- v.Add(new DerBitString(dilithiumPrivateKeyParameters.Tr));
- v.Add(new DerBitString(dilithiumPrivateKeyParameters.S1));
- v.Add(new DerBitString(dilithiumPrivateKeyParameters.S2));
- v.Add(new DerBitString(dilithiumPrivateKeyParameters.T0));
-
- AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(
+ AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(
PqcUtilities.DilithiumOidLookup(dilithiumPrivateKeyParameters.Parameters));
DilithiumPublicKeyParameters pubParams = dilithiumPrivateKeyParameters.GetPublicKeyParameters();
- return new PrivateKeyInfo(algorithmIdentifier, new DerSequence(v), attributes, pubParams.GetEncoded());
+ return new PrivateKeyInfo(algorithmIdentifier, new DerOctetString(dilithiumPrivateKeyParameters.GetEncoded()), attributes, pubParams.GetEncoded());
}
if (privateKey is BikePrivateKeyParameters bikePrivateKeyParameters)
{
|