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

KemUtilities

public static class KemUtilities
using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Kems; using Org.BouncyCastle.Crypto.Parameters; using System; using System.Collections.Generic; namespace Org.BouncyCastle.Security { public static class KemUtilities { private static readonly Dictionary<string, string> ByName; private static readonly Dictionary<DerObjectIdentifier, string> ByOid; static KemUtilities() { ByName = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); ByOid = new Dictionary<DerObjectIdentifier, string>(); foreach (MLKemParameters value in MLKemParameters.ByName.Values) { Register(value.Name, value.Oid); } } private static void Register(string name, DerObjectIdentifier oid) { if (name == null) throw new ArgumentNullException("name"); ByName.Add(name, name); if (oid != null) ByOid.Add(oid, name); } internal static byte[] Decapsulate(IKemDecapsulator kemDecapsulator, byte[] encBuf, int encOff, int encLen) { if (kemDecapsulator == null) throw new ArgumentNullException("kemDecapsulator"); byte[] array = new byte[kemDecapsulator.SecretLength]; kemDecapsulator.Decapsulate(encBuf, encOff, encLen, array, 0, array.Length); return array; } internal static Tuple<byte[], byte[]> Encapsulate(IKemEncapsulator kemEncapsulator) { if (kemEncapsulator == null) throw new ArgumentNullException("kemEncapsulator"); byte[] array = new byte[kemEncapsulator.EncapsulationLength]; byte[] array2 = new byte[kemEncapsulator.SecretLength]; kemEncapsulator.Encapsulate(array, 0, array.Length, array2, 0, array2.Length); return Tuple.Create(array, array2); } public static IKemDecapsulator GetDecapsulator(DerObjectIdentifier oid) { if (TryGetDecapsulator(oid, out IKemDecapsulator decapsulator)) return decapsulator; throw new SecurityUtilityException("KEM OID not recognised."); } public static IKemDecapsulator GetDecapsulator(string name) { if (TryGetDecapsulator(name, out IKemDecapsulator decapsulator)) return decapsulator; throw new SecurityUtilityException("KEM name not recognised."); } public static IKemEncapsulator GetEncapsulator(DerObjectIdentifier oid) { if (TryGetEncapsulator(oid, out IKemEncapsulator encapsulator)) return encapsulator; throw new SecurityUtilityException("KEM OID not recognised."); } public static IKemEncapsulator GetEncapsulator(string name) { if (TryGetEncapsulator(name, out IKemEncapsulator encapsulator)) return encapsulator; throw new SecurityUtilityException("KEM name not recognised."); } public static bool TryGetDecapsulator(DerObjectIdentifier oid, out IKemDecapsulator decapsulator) { if (oid == null) throw new ArgumentNullException("oid"); if (TryGetMechanism(oid, out string mechanism)) { IKemDecapsulator decapForMechanism = GetDecapForMechanism(mechanism); if (decapForMechanism != null) { decapsulator = decapForMechanism; return true; } } decapsulator = null; return false; } public static bool TryGetDecapsulator(string name, out IKemDecapsulator decapsulator) { if (name == null) throw new ArgumentNullException("name"); if (TryGetMechanism(name, out string mechanism)) { IKemDecapsulator decapForMechanism = GetDecapForMechanism(mechanism); if (decapForMechanism != null) { decapsulator = decapForMechanism; return true; } } decapsulator = null; return false; } public static bool TryGetEncapsulator(DerObjectIdentifier oid, out IKemEncapsulator encapsulator) { if (oid == null) throw new ArgumentNullException("oid"); if (TryGetMechanism(oid, out string mechanism)) { IKemEncapsulator encapForMechanism = GetEncapForMechanism(mechanism); if (encapForMechanism != null) { encapsulator = encapForMechanism; return true; } } encapsulator = null; return false; } public static bool TryGetEncapsulator(string name, out IKemEncapsulator encapsulator) { if (name == null) throw new ArgumentNullException("name"); if (TryGetMechanism(name, out string mechanism)) { IKemEncapsulator encapForMechanism = GetEncapForMechanism(mechanism); if (encapForMechanism != null) { encapsulator = encapForMechanism; return true; } } encapsulator = null; return false; } private static IKemDecapsulator GetDecapForMechanism(string mechanism) { if (MLKemParameters.ByName.TryGetValue(mechanism, out MLKemParameters value)) return new MLKemDecapsulator(value); return null; } private static IKemEncapsulator GetEncapForMechanism(string mechanism) { if (MLKemParameters.ByName.TryGetValue(mechanism, out MLKemParameters value)) return new MLKemEncapsulator(value); return null; } private static bool TryGetMechanism(DerObjectIdentifier oid, out string mechanism) { return ByOid.TryGetValue(oid, out mechanism); } private static bool TryGetMechanism(string name, out string mechanism) { if (DerObjectIdentifier.TryFromID(name, out DerObjectIdentifier oid)) return TryGetMechanism(oid, out mechanism); return ByName.TryGetValue(name, out mechanism); } } }