public void Init(IDerivationParameters param)
        {
            KdfCounterParameters kdfParams = param as KdfCounterParameters;

            if (kdfParams == null)
            {
                throw new ArgumentException("Wrong type of arguments given");
            }



            // --- init mac based PRF ---

            this.prf.Init(new KeyParameter(kdfParams.Ki));

            // --- set arguments ---

            this.fixedInputDataCtrPrefix = kdfParams.FixedInputDataCounterPrefix;
            this.fixedInputData_afterCtr = kdfParams.FixedInputDataCounterSuffix;

            int r = kdfParams.R;

            this.ios = new byte[r / 8];

            BigInteger maxSize = Two.Pow(r).Multiply(BigInteger.ValueOf(h));

            this.maxSizeExcl = maxSize.CompareTo(IntegerMax) == 1 ?
                               Int32.MaxValue : maxSize.IntValue;

            // --- set operational state ---

            generatedBytes = 0;
        }
        private void ProcessVectors(string name, ArrayList vectors)
        {
            foreach (Vector vector in vectors)
            {
                IMac prf = CavpReader.CreatePrf(vector);
                KdfCounterBytesGenerator gen = new KdfCounterBytesGenerator(prf);
                int r = -1;
                {
                    string rlen = vector.HeaderAsString("RLEN");
                    if (rlen == null)
                    {
                        Assert.Fail("No RLEN");
                    }
                    r = Int32.Parse(rlen.Split('_')[0]);
                }
                int    count = vector.ValueAsInt("COUNT");
                int    l     = vector.ValueAsInt("L");
                byte[] ki    = vector.ValueAsBytes("KI");
                if (vector.HeaderAsString("CTRLOCATION") == "BEFORE_FIXED")
                {
                    byte[] fixedInputData      = vector.ValueAsBytes("FixedInputData");
                    KdfCounterParameters param = new KdfCounterParameters(ki, null, fixedInputData, r);
                    gen.Init(param);
                }
                else if (vector.HeaderAsString("CTRLOCATION") == "AFTER_FIXED")
                {
                    byte[] fixedInputData      = vector.ValueAsBytes("FixedInputData");
                    KdfCounterParameters param = new KdfCounterParameters(ki, fixedInputData, null, r);
                    gen.Init(param);
                }
                else if (vector.HeaderAsString("CTRLOCATION") == "MIDDLE_FIXED")
                {
                    byte[] DataBeforeCtrData   = vector.ValueAsBytes("DataBeforeCtrData");
                    byte[] DataAfterCtrData    = vector.ValueAsBytes("DataAfterCtrData");
                    KdfCounterParameters param = new KdfCounterParameters(ki, DataBeforeCtrData, DataAfterCtrData, r);
                    gen.Init(param);
                }
                else
                {
                    throw new InvalidOperationException("Unknown CTRLOCATION: " + vector.HeaderAsString("CTRLOCATION"));
                }

                byte[] koGenerated = new byte[l / 8];
                gen.GenerateBytes(koGenerated, 0, koGenerated.Length);

                byte[] koVectors = vector.ValueAsBytes("KO");
                CompareKO(name, vector, count, koGenerated, koVectors);
            }
        }