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.
74 lines
2.5 KiB
74 lines
2.5 KiB
#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
|
|
|