<PackageReference Include="BouncyCastle.Cryptography" Version="2.3.1" />

PqcPrivateKeyFactory

public static class PqcPrivateKeyFactory
using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.BC; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Utilities; using Org.BouncyCastle.Pqc.Asn1; using Org.BouncyCastle.Pqc.Crypto.Bike; using Org.BouncyCastle.Pqc.Crypto.Cmce; using Org.BouncyCastle.Pqc.Crypto.Crystals.Dilithium; using Org.BouncyCastle.Pqc.Crypto.Crystals.Kyber; using Org.BouncyCastle.Pqc.Crypto.Falcon; using Org.BouncyCastle.Pqc.Crypto.Frodo; using Org.BouncyCastle.Pqc.Crypto.Hqc; using Org.BouncyCastle.Pqc.Crypto.Lms; using Org.BouncyCastle.Pqc.Crypto.Picnic; using Org.BouncyCastle.Pqc.Crypto.Saber; using Org.BouncyCastle.Pqc.Crypto.Sike; using Org.BouncyCastle.Pqc.Crypto.SphincsPlus; using Org.BouncyCastle.Utilities; using System; using System.IO; namespace Org.BouncyCastle.Pqc.Crypto.Utilities { public static class PqcPrivateKeyFactory { public static AsymmetricKeyParameter CreateKey(byte[] privateKeyInfoData) { return CreateKey(PrivateKeyInfo.GetInstance(Asn1Object.FromByteArray(privateKeyInfoData))); } public static AsymmetricKeyParameter CreateKey(Stream inStr) { return CreateKey(PrivateKeyInfo.GetInstance(new Asn1InputStream(inStr).ReadObject())); } public static AsymmetricKeyParameter CreateKey(PrivateKeyInfo keyInfo) { DerObjectIdentifier algorithm = keyInfo.PrivateKeyAlgorithm.Algorithm; if (algorithm.Equals(PkcsObjectIdentifiers.IdAlgHssLmsHashsig)) { byte[] octets = Asn1OctetString.GetInstance(keyInfo.ParsePrivateKey()).GetOctets(); DerBitString publicKey = keyInfo.PublicKey; if (Pack.BE_To_UInt32(octets, 0) == 1) { if (publicKey != null) { byte[] octets2 = publicKey.GetOctets(); return LmsPrivateKeyParameters.GetInstance(Arrays.CopyOfRange(octets, 4, octets.Length), Arrays.CopyOfRange(octets2, 4, octets2.Length)); } return LmsPrivateKeyParameters.GetInstance(Arrays.CopyOfRange(octets, 4, octets.Length)); } } if (algorithm.On(BCObjectIdentifiers.pqc_kem_mceliece)) { CmcePrivateKey instance = CmcePrivateKey.GetInstance(keyInfo.ParsePrivateKey()); return new CmcePrivateKeyParameters(PqcUtilities.McElieceParamsLookup(algorithm), instance.Delta, instance.C, instance.G, instance.Alpha, instance.S); } if (algorithm.On(BCObjectIdentifiers.pqc_kem_frodo)) { byte[] octets3 = Asn1OctetString.GetInstance(keyInfo.ParsePrivateKey()).GetOctets(); return new FrodoPrivateKeyParameters(PqcUtilities.FrodoParamsLookup(algorithm), octets3); } if (algorithm.On(BCObjectIdentifiers.sphincsPlus) || algorithm.On(BCObjectIdentifiers.sphincsPlus_interop)) { Asn1Encodable asn1Encodable = keyInfo.ParsePrivateKey(); SphincsPlusParameters parameters = PqcUtilities.SphincsPlusParamsLookup(algorithm); Asn1Sequence asn1Sequence = asn1Encodable as Asn1Sequence; if (asn1Sequence != null) { SphincsPlusPrivateKey instance2 = SphincsPlusPrivateKey.GetInstance(asn1Sequence); SphincsPlusPublicKey publicKey2 = instance2.PublicKey; return new SphincsPlusPrivateKeyParameters(parameters, instance2.GetSkseed(), instance2.GetSkprf(), publicKey2.GetPkseed(), publicKey2.GetPkroot()); } Asn1OctetString instance3 = Asn1OctetString.GetInstance(asn1Encodable); return new SphincsPlusPrivateKeyParameters(parameters, instance3.GetOctets()); } if (algorithm.On(BCObjectIdentifiers.pqc_kem_saber)) { byte[] octets4 = Asn1OctetString.GetInstance(keyInfo.ParsePrivateKey()).GetOctets(); return new SaberPrivateKeyParameters(PqcUtilities.SaberParamsLookup(algorithm), octets4); } if (algorithm.On(BCObjectIdentifiers.picnic)) { byte[] octets5 = Asn1OctetString.GetInstance(keyInfo.ParsePrivateKey()).GetOctets(); return new PicnicPrivateKeyParameters(PqcUtilities.PicnicParamsLookup(algorithm), octets5); } if (algorithm.On(BCObjectIdentifiers.pqc_kem_sike)) { byte[] octets6 = Asn1OctetString.GetInstance(keyInfo.ParsePrivateKey()).GetOctets(); return new SikePrivateKeyParameters(PqcUtilities.SikeParamsLookup(algorithm), octets6); } if (algorithm.On(BCObjectIdentifiers.pqc_kem_bike)) { byte[] octets7 = Asn1OctetString.GetInstance(keyInfo.ParsePrivateKey()).GetOctets(); BikeParameters bikeParameters = PqcUtilities.BikeParamsLookup(algorithm); byte[] h = Arrays.CopyOfRange(octets7, 0, bikeParameters.RByte); byte[] h2 = Arrays.CopyOfRange(octets7, bikeParameters.RByte, 2 * bikeParameters.RByte); byte[] sigma = Arrays.CopyOfRange(octets7, 2 * bikeParameters.RByte, octets7.Length); return new BikePrivateKeyParameters(bikeParameters, h, h2, sigma); } if (algorithm.On(BCObjectIdentifiers.pqc_kem_hqc)) { byte[] octets8 = Asn1OctetString.GetInstance(keyInfo.ParsePrivateKey()).GetOctets(); return new HqcPrivateKeyParameters(PqcUtilities.HqcParamsLookup(algorithm), octets8); } if (algorithm.On(BCObjectIdentifiers.pqc_kem_kyber)) { Asn1OctetString instance4 = Asn1OctetString.GetInstance(keyInfo.ParsePrivateKey()); return new KyberPrivateKeyParameters(PqcUtilities.KyberParamsLookup(algorithm), instance4.GetOctets()); } if (algorithm.Equals(BCObjectIdentifiers.dilithium2) || algorithm.Equals(BCObjectIdentifiers.dilithium3) || algorithm.Equals(BCObjectIdentifiers.dilithium5)) { Asn1OctetString instance5 = Asn1OctetString.GetInstance(keyInfo.ParsePrivateKey()); DilithiumParameters dilithiumParameters = PqcUtilities.DilithiumParamsLookup(algorithm); DerBitString publicKey3 = keyInfo.PublicKey; if (publicKey3 != null) { DilithiumPublicKeyParameters publicKeyParameters = PqcPublicKeyFactory.DilithiumConverter.GetPublicKeyParameters(dilithiumParameters, publicKey3); return new DilithiumPrivateKeyParameters(dilithiumParameters, instance5.GetOctets(), publicKeyParameters); } return new DilithiumPrivateKeyParameters(dilithiumParameters, instance5.GetOctets(), null); } if (algorithm.Equals(BCObjectIdentifiers.falcon_512) || algorithm.Equals(BCObjectIdentifiers.falcon_1024)) { Asn1Sequence instance6 = Asn1Sequence.GetInstance(keyInfo.ParsePrivateKey()); FalconParameters parameters2 = PqcUtilities.FalconParamsLookup(algorithm); int intValueExact = DerInteger.GetInstance(instance6[0]).IntValueExact; if (intValueExact != 1) throw new IOException("unknown private key version: " + intValueExact.ToString()); return new FalconPrivateKeyParameters(parameters2, Asn1OctetString.GetInstance(instance6[1]).GetOctets(), Asn1OctetString.GetInstance(instance6[2]).GetOctets(), Asn1OctetString.GetInstance(instance6[3]).GetOctets(), keyInfo.PublicKey?.GetOctets()); } throw new Exception("algorithm identifier in private key not recognised"); } } }