PasswordRecipientInfoGenerator
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.Cms;
using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities;
namespace Org.BouncyCastle.Cms
{
internal class PasswordRecipientInfoGenerator : RecipientInfoGenerator
{
private AlgorithmIdentifier keyDerivationAlgorithm;
private KeyParameter keyEncryptionKey;
private string keyEncryptionKeyOID;
internal AlgorithmIdentifier KeyDerivationAlgorithm {
set {
keyDerivationAlgorithm = value;
}
}
internal KeyParameter KeyEncryptionKey {
set {
keyEncryptionKey = value;
}
}
internal string KeyEncryptionKeyOID {
set {
keyEncryptionKeyOID = value;
}
}
internal PasswordRecipientInfoGenerator()
{
}
public RecipientInfo Generate(KeyParameter contentEncryptionKey, SecureRandom random)
{
byte[] key = contentEncryptionKey.GetKey();
string rfc3211WrapperName = CmsEnvelopedHelper.GetRfc3211WrapperName(keyEncryptionKeyOID);
IWrapper wrapper = WrapperUtilities.GetWrapper(rfc3211WrapperName);
byte[] array = new byte[Platform.StartsWithIgnoreCase(rfc3211WrapperName, "DES") ? 8 : 16];
random.NextBytes(array);
ParametersWithIV parameters = new ParametersWithIV(keyEncryptionKey, array);
wrapper.Init(true, new ParametersWithRandom(parameters, random));
Asn1OctetString encryptedKey = new DerOctetString(wrapper.Wrap(key, 0, key.Length));
DerSequence parameters2 = new DerSequence(new DerObjectIdentifier(keyEncryptionKeyOID), new DerOctetString(array));
AlgorithmIdentifier keyEncryptionAlgorithm = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdAlgPwriKek, parameters2);
return new RecipientInfo(new PasswordRecipientInfo(keyDerivationAlgorithm, keyEncryptionAlgorithm, encryptedKey));
}
}
}