100 lines
2.6 KiB
C#
100 lines
2.6 KiB
C#
using System;
|
|
using System.Collections;
|
|
|
|
using Org.BouncyCastle.Asn1.Pkcs;
|
|
using Org.BouncyCastle.Crypto;
|
|
using Org.BouncyCastle.Security;
|
|
|
|
namespace Org.BouncyCastle.Cms
|
|
{
|
|
class CmsEnvelopedHelper
|
|
{
|
|
internal static readonly CmsEnvelopedHelper Instance = new CmsEnvelopedHelper();
|
|
|
|
private static readonly IDictionary KeySizes = new Hashtable();
|
|
private static readonly IDictionary Ciphers = new Hashtable();
|
|
private static readonly IDictionary BaseCipherNames = new Hashtable();
|
|
// private static readonly IDictionary CipherAlgNames = new Hashtable();
|
|
|
|
static CmsEnvelopedHelper()
|
|
{
|
|
KeySizes.Add(CmsEnvelopedGenerator.DesEde3Cbc, 192);
|
|
KeySizes.Add(CmsEnvelopedGenerator.Aes128Cbc, 128);
|
|
KeySizes.Add(CmsEnvelopedGenerator.Aes192Cbc, 192);
|
|
KeySizes.Add(CmsEnvelopedGenerator.Aes256Cbc, 256);
|
|
|
|
BaseCipherNames.Add(CmsEnvelopedGenerator.DesEde3Cbc, "DESEDE");
|
|
BaseCipherNames.Add(CmsEnvelopedGenerator.Aes128Cbc, "AES");
|
|
BaseCipherNames.Add(CmsEnvelopedGenerator.Aes192Cbc, "AES");
|
|
BaseCipherNames.Add(CmsEnvelopedGenerator.Aes256Cbc, "AES");
|
|
|
|
// CipherAlgNames.Add(CmsEnvelopedGenerator.DesEde3Cbc, "DESEDE/CBC/PKCS5Padding");
|
|
// CipherAlgNames.Add(CmsEnvelopedGenerator.Aes128Cbc, "AES/CBC/PKCS5Padding");
|
|
// CipherAlgNames.Add(CmsEnvelopedGenerator.Aes192Cbc, "AES/CBC/PKCS5Padding");
|
|
// CipherAlgNames.Add(CmsEnvelopedGenerator.Aes256Cbc, "AES/CBC/PKCS5Padding");
|
|
}
|
|
|
|
private string GetAsymmetricEncryptionAlgName(
|
|
string encryptionAlgOid)
|
|
{
|
|
if (PkcsObjectIdentifiers.RsaEncryption.Id.Equals(encryptionAlgOid))
|
|
{
|
|
return "RSA/ECB/PKCS1Padding";
|
|
}
|
|
|
|
return encryptionAlgOid;
|
|
}
|
|
|
|
internal IBufferedCipher CreateAsymmetricCipher(
|
|
string encryptionOid)
|
|
{
|
|
try
|
|
{
|
|
return CipherUtilities.GetCipher(encryptionOid);
|
|
}
|
|
catch (SecurityUtilityException)
|
|
{
|
|
return CipherUtilities.GetCipher(GetAsymmetricEncryptionAlgName(encryptionOid));
|
|
}
|
|
}
|
|
|
|
internal IWrapper CreateWrapper(
|
|
string encryptionOid)
|
|
{
|
|
try
|
|
{
|
|
return WrapperUtilities.GetWrapper(encryptionOid);
|
|
}
|
|
catch (SecurityUtilityException)
|
|
{
|
|
return WrapperUtilities.GetWrapper(GetAsymmetricEncryptionAlgName(encryptionOid));
|
|
}
|
|
}
|
|
|
|
internal string GetRfc3211WrapperName(
|
|
string oid)
|
|
{
|
|
if (oid == null)
|
|
throw new ArgumentNullException("oid");
|
|
|
|
string alg = (string) BaseCipherNames[oid];
|
|
|
|
if (alg == null)
|
|
throw new ArgumentException("no name for " + oid, "oid");
|
|
|
|
return alg + "RFC3211Wrap";
|
|
}
|
|
|
|
internal int GetKeySize(
|
|
string oid)
|
|
{
|
|
if (!KeySizes.Contains(oid))
|
|
{
|
|
throw new ArgumentException("no keysize for " + oid, "oid");
|
|
}
|
|
|
|
return (int) KeySizes[oid];
|
|
}
|
|
}
|
|
}
|