100 lines
2.4 KiB
C#
100 lines
2.4 KiB
C#
using System.Collections;
|
|
using System.Globalization;
|
|
|
|
using Org.BouncyCastle.Asn1;
|
|
using Org.BouncyCastle.Asn1.X9;
|
|
using Org.BouncyCastle.Crypto;
|
|
using Org.BouncyCastle.Crypto.Agreement;
|
|
using Org.BouncyCastle.Crypto.Agreement.Kdf;
|
|
using Org.BouncyCastle.Crypto.Digests;
|
|
|
|
namespace Org.BouncyCastle.Security
|
|
{
|
|
/// <remarks>
|
|
/// Utility class for creating IBasicAgreement objects from their names/Oids
|
|
/// </remarks>
|
|
public sealed class AgreementUtilities
|
|
{
|
|
private AgreementUtilities()
|
|
{
|
|
}
|
|
|
|
private static readonly Hashtable algorithms = new Hashtable();
|
|
// private static readonly Hashtable oids = new Hashtable();
|
|
|
|
static AgreementUtilities()
|
|
{
|
|
//algorithms[X9ObjectIdentifiers.DHSinglePassCofactorDHSha1KdfScheme.Id] = ?;
|
|
algorithms[X9ObjectIdentifiers.DHSinglePassStdDHSha1KdfScheme.Id] = "DHWITHSHA1KDF";
|
|
//algorithms[X9ObjectIdentifiers.MqvSinglePassSha1KdfScheme.Id] = ?;
|
|
}
|
|
|
|
public static IBasicAgreement GetBasicAgreement(
|
|
DerObjectIdentifier oid)
|
|
{
|
|
return GetBasicAgreement(oid.Id);
|
|
}
|
|
|
|
public static IBasicAgreement GetBasicAgreement(
|
|
string algorithm)
|
|
{
|
|
string upper = algorithm.ToUpper(CultureInfo.InvariantCulture);
|
|
string mechanism = (string) algorithms[upper];
|
|
|
|
if (mechanism == null)
|
|
{
|
|
mechanism = upper;
|
|
}
|
|
|
|
switch (mechanism)
|
|
{
|
|
case "DH":
|
|
return new DHBasicAgreement();
|
|
case "ECDH":
|
|
return new ECDHBasicAgreement();
|
|
case "ECDHC":
|
|
return new ECDHCBasicAgreement();
|
|
}
|
|
|
|
throw new SecurityUtilityException("Basic Agreement " + algorithm + " not recognised.");
|
|
}
|
|
|
|
public static IBasicAgreement GetBasicAgreementWithKdf(
|
|
DerObjectIdentifier oid,
|
|
string wrapAlgorithm)
|
|
{
|
|
return GetBasicAgreementWithKdf(oid.Id, wrapAlgorithm);
|
|
}
|
|
|
|
public static IBasicAgreement GetBasicAgreementWithKdf(
|
|
string agreeAlgorithm,
|
|
string wrapAlgorithm)
|
|
{
|
|
string upper = agreeAlgorithm.ToUpper(CultureInfo.InvariantCulture);
|
|
string mechanism = (string) algorithms[upper];
|
|
|
|
if (mechanism == null)
|
|
{
|
|
mechanism = upper;
|
|
}
|
|
|
|
switch (mechanism)
|
|
{
|
|
case "DHWITHSHA1KDF":
|
|
return new ECDHWithKdfBasicAgreement(
|
|
wrapAlgorithm,
|
|
new ECDHKekGenerator(
|
|
new Sha1Digest()));
|
|
}
|
|
|
|
throw new SecurityUtilityException("Basic Agreement (with KDF) " + agreeAlgorithm + " not recognised.");
|
|
}
|
|
|
|
public static string GetAlgorithmName(
|
|
DerObjectIdentifier oid)
|
|
{
|
|
return (string) algorithms[oid.Id];
|
|
}
|
|
}
|
|
}
|