1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- #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
|