Exemple #1
0
        private static void Combine()
        {
            if (!Arguments.QuietMode)
            {
                Console.WriteLine("Enter {0} shares separated by newlines:", Arguments.Threshold);
            }

            int polynomialDegree = -1;

            var totalShares = new List <string>();

            for (int i = 0; i < Arguments.Threshold; i++)
            {
                if (!Arguments.QuietMode)
                {
                    Console.Write("Share [{0}/{1}]: ", i + 1, Arguments.Threshold);
                }

                string currentShare = String.Empty;

                try {
                    currentShare = Console.ReadLine();
                }
                catch {
                    Fatal("I/O error while reading shares");
                }

                SecretShare share;

                if (!SecretShare.TryParse(currentShare, out share))
                {
                    Fatal("invalid syntax");
                }

                if (polynomialDegree < 0)
                {
                    polynomialDegree = share.Point.Y.PrimePolynomial.Degree;
                    if (!IrreduciblePolynomial.IsValidDegree(polynomialDegree))
                    {
                        Fatal("share has illegal length");
                    }
                }
                else if (polynomialDegree != share.Point.Y.PrimePolynomial.Degree)
                {
                    Fatal("shares have different security levels");
                }

                totalShares.Add(currentShare);
            }

            Diffuser diffuser = new NullDiffuser();

            if (Arguments.EnableDiffusion)
            {
                if (polynomialDegree >= 64)
                {
                    diffuser = new XteaDiffuser();
                }
                else
                {
                    Warning("security level too small for the diffusion layer");
                }
            }

            var recoveredSecret = SecretCombiner.Combine(totalShares, diffuser);

            if (!Arguments.QuietMode)
            {
                Console.Error.Write("Resulting secret: ");
            }

            Console.Error.WriteLine(Arguments.HexMode ? recoveredSecret.RecoveredHexString : recoveredSecret.RecoveredTextString);
        }