You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.5 KiB
75 lines
2.5 KiB
1 year ago
|
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
|
||
|
#pragma warning disable
|
||
|
using System;
|
||
|
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Cms;
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Pkcs;
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto;
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Security;
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
|
||
|
|
||
|
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Cms
|
||
|
{
|
||
|
internal class PasswordRecipientInfoGenerator : RecipientInfoGenerator
|
||
|
{
|
||
|
private static readonly CmsEnvelopedHelper Helper = CmsEnvelopedHelper.Instance;
|
||
|
|
||
|
private AlgorithmIdentifier keyDerivationAlgorithm;
|
||
|
private KeyParameter keyEncryptionKey;
|
||
|
// TODO Can get this from keyEncryptionKey?
|
||
|
private string keyEncryptionKeyOID;
|
||
|
|
||
|
internal PasswordRecipientInfoGenerator()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
internal AlgorithmIdentifier KeyDerivationAlgorithm
|
||
|
{
|
||
|
set { this.keyDerivationAlgorithm = value; }
|
||
|
}
|
||
|
|
||
|
internal KeyParameter KeyEncryptionKey
|
||
|
{
|
||
|
set { this.keyEncryptionKey = value; }
|
||
|
}
|
||
|
|
||
|
internal string KeyEncryptionKeyOID
|
||
|
{
|
||
|
set { this.keyEncryptionKeyOID = value; }
|
||
|
}
|
||
|
|
||
|
public RecipientInfo Generate(KeyParameter contentEncryptionKey, SecureRandom random)
|
||
|
{
|
||
|
byte[] keyBytes = contentEncryptionKey.GetKey();
|
||
|
|
||
|
string rfc3211WrapperName = Helper.GetRfc3211WrapperName(keyEncryptionKeyOID);
|
||
|
IWrapper keyWrapper = Helper.CreateWrapper(rfc3211WrapperName);
|
||
|
|
||
|
// Note: In Java build, the IV is automatically generated in JCE layer
|
||
|
int ivLength = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.StartsWith(rfc3211WrapperName, "DESEDE") ? 8 : 16;
|
||
|
byte[] iv = new byte[ivLength];
|
||
|
random.NextBytes(iv);
|
||
|
|
||
|
ICipherParameters parameters = new ParametersWithIV(keyEncryptionKey, iv);
|
||
|
keyWrapper.Init(true, new ParametersWithRandom(parameters, random));
|
||
|
Asn1OctetString encryptedKey = new DerOctetString(
|
||
|
keyWrapper.Wrap(keyBytes, 0, keyBytes.Length));
|
||
|
|
||
|
DerSequence seq = new DerSequence(
|
||
|
new DerObjectIdentifier(keyEncryptionKeyOID),
|
||
|
new DerOctetString(iv));
|
||
|
|
||
|
AlgorithmIdentifier keyEncryptionAlgorithm = new AlgorithmIdentifier(
|
||
|
PkcsObjectIdentifiers.IdAlgPwriKek, seq);
|
||
|
|
||
|
return new RecipientInfo(new PasswordRecipientInfo(
|
||
|
keyDerivationAlgorithm, keyEncryptionAlgorithm, encryptedKey));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#pragma warning restore
|
||
|
#endif
|