private PrimeGeneratorResult GeneratePrimes(PrimeGeneratorParameters param)
        {
            BigInteger p, p1, p2, q, q1, q2;

            // 1, 2, 3, 4 covered by Guards

            // 5
            var workingSeed = param.Seed.ToPositiveBigInteger();

            // 6
            var pResult = PrimeGeneratorHelper.ProvablePrimeConstruction(_sha, param.Modulus / 2, param.BitLens[0], param.BitLens[1], workingSeed, param.PublicE);

            if (!pResult.Success)
            {
                return(new PrimeGeneratorResult($"Bad p gen: {pResult.ErrorMessage}"));
            }

            p           = pResult.Prime;
            p1          = pResult.Prime1;
            p2          = pResult.Prime2;
            workingSeed = pResult.PrimeSeed;

            do
            {
                // 7
                var qResult = PrimeGeneratorHelper.ProvablePrimeConstruction(_sha, param.Modulus / 2, param.BitLens[2], param.BitLens[3], workingSeed, param.PublicE);
                if (!qResult.Success)
                {
                    return(new PrimeGeneratorResult($"Bad q gen: {qResult.ErrorMessage}"));
                }

                q           = qResult.Prime;
                q1          = qResult.Prime1;
                q2          = qResult.Prime2;
                workingSeed = qResult.PrimeSeed;

                // 8
            } while (BigInteger.Abs(p - q) <= NumberTheory.Pow2(param.Modulus / 2 - 100));

            var auxValues = new AuxiliaryResult();
            var primePair = new PrimePair {
                P = p, Q = q
            };

            return(new PrimeGeneratorResult(primePair, auxValues));
        }
        private PrimeGeneratorResult GeneratePrimes(PrimeGeneratorParameters param)
        {
            // 1, 2, 3, 4 covered by guards

            // 5
            var workingSeed = param.Seed.ToPositiveBigInteger();

            // 6
            var ppcResult = PrimeGeneratorHelper.ProvablePrimeConstruction(_sha, param.Modulus / 2, 1, 1, workingSeed, param.PublicE);

            if (!ppcResult.Success)
            {
                return(new PrimeGeneratorResult($"Bad Provable Prime Construction for p: {ppcResult.ErrorMessage}"));
            }
            var p = ppcResult.Prime;

            workingSeed = ppcResult.PrimeSeed;

            BigInteger q;

            do
            {
                // 7
                ppcResult = PrimeGeneratorHelper.ProvablePrimeConstruction(_sha, param.Modulus / 2, 1, 1, workingSeed, param.PublicE);
                if (!ppcResult.Success)
                {
                    return(new PrimeGeneratorResult($"Bad Provable Prime Construction for q: {ppcResult.ErrorMessage}"));
                }
                q           = ppcResult.Prime;
                workingSeed = ppcResult.PrimeSeed;

                // 8
            } while (BigInteger.Abs(p - q) <= NumberTheory.Pow2(param.Modulus / 2 - 100));

            // 9, 10
            var auxValues = new AuxiliaryResult();
            var primePair = new PrimePair {
                P = p, Q = q
            };

            return(new PrimeGeneratorResult(primePair, auxValues));
        }