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);
}
}
}