Pkcs12ParametersGenerator
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities;
using System;
namespace Org.BouncyCastle.Crypto.Generators
{
    public class Pkcs12ParametersGenerator : PbeParametersGenerator
    {
        public const int KeyMaterial = 1;
        public const int IVMaterial = 2;
        public const int MacMaterial = 3;
        private readonly IDigest digest;
        private readonly int u;
        private readonly int v;
        public Pkcs12ParametersGenerator(IDigest digest)
        {
            this.digest = digest;
            u = digest.GetDigestSize();
            v = digest.GetByteLength();
        }
        private void Adjust(byte[] a, int aOff, byte[] b)
        {
            uint num = (uint)(b[b.Length - 1] + a[aOff + b.Length - 1] + 1);
            a[aOff + b.Length - 1] = (byte)num;
            num >>= 8;
            for (int num2 = b.Length - 2; num2 >= 0; num2--) {
                num = (uint)((int)num + (b[num2] + a[aOff + num2]));
                a[aOff + num2] = (byte)num;
                num >>= 8;
            }
        }
        private byte[] GenerateDerivedKey(byte idByte, int n)
        {
            byte[] array = new byte[n];
            GenerateDerivedKey(idByte, array);
            return array;
        }
        private void GenerateDerivedKey(byte idByte, byte[] dKey)
        {
            byte[] array = new byte[v];
            Arrays.Fill(array, idByte);
            byte[] array2 = Array.Empty<byte>();
            if (!Arrays.IsNullOrEmpty(mSalt)) {
                array2 = new byte[v * ((mSalt.Length + v - 1) / v)];
                RepeatFill(mSalt, array2);
            }
            byte[] array3 = Array.Empty<byte>();
            if (!Arrays.IsNullOrEmpty(mPassword)) {
                array3 = new byte[v * ((mPassword.Length + v - 1) / v)];
                RepeatFill(mPassword, array3);
            }
            byte[] array4 = Arrays.Concatenate(array2, array3);
            byte[] array5 = new byte[u];
            byte[] array6 = new byte[v];
            int num = (dKey.Length + u - 1) / u;
            for (int i = 1; i <= num; i++) {
                digest.BlockUpdate(array, 0, array.Length);
                digest.BlockUpdate(array4, 0, array4.Length);
                digest.DoFinal(array5, 0);
                for (int j = 1; j != mIterationCount; j++) {
                    digest.BlockUpdate(array5, 0, array5.Length);
                    digest.DoFinal(array5, 0);
                }
                RepeatFill(array5, array6);
                for (int k = 0; k < array4.Length; k += v) {
                    Adjust(array4, k, array6);
                }
                if (i == num)
                    Array.Copy(array5, 0, dKey, (i - 1) * u, dKey.Length - (i - 1) * u);
                else
                    Array.Copy(array5, 0, dKey, (i - 1) * u, array5.Length);
            }
        }
        public override ICipherParameters GenerateDerivedParameters(string algorithm, int keySize)
        {
            keySize /= 8;
            byte[] keyBytes = GenerateDerivedKey(1, keySize);
            return ParameterUtilities.CreateKeyParameter(algorithm, keyBytes, 0, keySize);
        }
        public override ICipherParameters GenerateDerivedParameters(string algorithm, int keySize, int ivSize)
        {
            keySize /= 8;
            ivSize /= 8;
            byte[] keyBytes = GenerateDerivedKey(1, keySize);
            KeyParameter parameters = ParameterUtilities.CreateKeyParameter(algorithm, keyBytes, 0, keySize);
            byte[] iv = GenerateDerivedKey(2, ivSize);
            return new ParametersWithIV(parameters, iv, 0, ivSize);
        }
        public override ICipherParameters GenerateDerivedMacParameters(int keySize)
        {
            keySize /= 8;
            return new KeyParameter(GenerateDerivedKey(3, keySize), 0, keySize);
        }
        private static void RepeatFill(byte[] x, byte[] z)
        {
            int num = x.Length;
            int num2 = z.Length;
            int i;
            for (i = 0; i < num2 - num; i += num) {
                Array.Copy(x, 0, z, i, num);
            }
            Array.Copy(x, 0, z, i, num2 - i);
        }
    }
}