public FiniteFieldPolynomial(IrreduciblePolynomial primePolynomial, params int[] setCoefficients) {
            _PrimePolynomial = primePolynomial;

            _PolynomialSetCoefficients = BigInteger.Zero;
            for (int i = 0; i < setCoefficients.Length; i++) {
                _PolynomialSetCoefficients = _PolynomialSetCoefficients.SetBit(setCoefficients[i]);
            }
        }
        private static IEnumerable<FiniteFieldPolynomial> GetRandomPolynomials(IrreduciblePolynomial irreduciblePolynomial, int total) {
            var rng = RandomNumberGenerator.Create();

            for (int i = 0; i < total; i++) {
                var randomCoefficientBytes = new byte[irreduciblePolynomial.SizeInBytes];
                rng.GetBytes(randomCoefficientBytes);
                yield return new FiniteFieldPolynomial(irreduciblePolynomial, randomCoefficientBytes.ToBigIntegerFromLittleEndianUnsignedBytes());
            }
        }
Beispiel #3
0
        public FiniteFieldPolynomial(IrreduciblePolynomial primePolynomial, params int[] setCoefficients)
        {
            _PrimePolynomial = primePolynomial;

            _PolynomialSetCoefficients = BigInteger.Zero;
            for (int i = 0; i < setCoefficients.Length; i++)
            {
                _PolynomialSetCoefficients = _PolynomialSetCoefficients.SetBit(setCoefficients[i]);
            }
        }
        public void TestInverse() {
            var rijndaelPoly = new IrreduciblePolynomial(8);
            var a = new FiniteFieldPolynomial(rijndaelPoly, 6, 4, 1, 0);
            var expectedInverse = new FiniteFieldPolynomial(rijndaelPoly, 7, 6, 3, 1);

            var actualInverse = a.GetInverse();

            Assert.AreEqual(expectedInverse.ToString(), actualInverse.ToString());
            var productSanityCheck = a*actualInverse;
            Assert.IsTrue(productSanityCheck.One.Equals(productSanityCheck));
        }
Beispiel #5
0
        internal static bool TryParse(Match match, out FiniteFieldPoint result)
        {
            if (!match.Success)
            {
                result = null;
                return(false);
            }

            try {
                var xString = match.Groups["x"].Value.ToLowerInvariant();
                var yString = match.Groups["y"].Value.ToLowerInvariant();

                // get rid of any initial 0's
                while (xString.StartsWith("0", StringComparison.Ordinal))
                {
                    xString = xString.Substring(1);
                }

                // Each hex letter makes up 4 bits, so to get the degree in bits
                // we multiply by 4

                int polynomialDegree = yString.Length * 4;

                var irp = new IrreduciblePolynomial(polynomialDegree);

                var x = new FiniteFieldPolynomial(irp, BigInteger.Parse(xString));

                // get bytes
                var bigEndianBytes = new byte[yString.Length / 2];
                for (int i = 0; i < yString.Length; i += 2)
                {
                    bigEndianBytes[i / 2] = Byte.Parse(yString.Substring(i, 2), NumberStyles.HexNumber);
                }
                var y = new FiniteFieldPolynomial(irp, bigEndianBytes.ToBigIntegerFromBigEndianUnsignedBytes());

                result = new FiniteFieldPoint(x, y);
                return(true);
            }
            catch (Exception exception) {
                result = null;
                return(false);
            }
        }
        public void BasicTests() {
            var rijndaelPoly = new IrreduciblePolynomial(8);
            var a = new FiniteFieldPolynomial(rijndaelPoly, 6, 4, 1, 0);
            var b = new FiniteFieldPolynomial(rijndaelPoly, 7, 6, 3, 1);
            var product = a*b;
            // "a" and "b" are inverses, so their product is 1
            Assert.AreEqual(1, (int)product.PolynomialValue);

            var g = new FiniteFieldPolynomial(rijndaelPoly, BigInteger.Parse("0e5", NumberStyles.HexNumber));
            var p = new FiniteFieldPolynomial(rijndaelPoly, BigInteger.One);

            // g is a generator, so we should generate all values except 0
            var vals = new HashSet<BigInteger> {p.PolynomialValue};

            for (int i = 0; i < 255; i++) {
                p = p*g;
                vals.Add(p.PolynomialValue);
            }

            Assert.AreEqual(255, vals.Count);
            Assert.IsTrue(vals.Contains((p*g).PolynomialValue));
        }
        internal static bool TryParse(Match match, out FiniteFieldPoint result) {
            if (!match.Success) {
                result = null;
                return false;
            }

            try {
                var xString = match.Groups["x"].Value.ToLowerInvariant();
                var yString = match.Groups["y"].Value.ToLowerInvariant();

                // get rid of any initial 0's
                while (xString.StartsWith("0", StringComparison.Ordinal)) {
                    xString = xString.Substring(1);
                }

                // Each hex letter makes up 4 bits, so to get the degree in bits
                // we multiply by 4

                int polynomialDegree = yString.Length*4;

                var irp = new IrreduciblePolynomial(polynomialDegree);

                var x = new FiniteFieldPolynomial(irp, BigInteger.Parse(xString));

                // get bytes
                var bigEndianBytes = new byte[yString.Length/2];
                for (int i = 0; i < yString.Length; i += 2) {
                    bigEndianBytes[i/2] = Byte.Parse(yString.Substring(i, 2), NumberStyles.HexNumber);
                }
                var y = new FiniteFieldPolynomial(irp, bigEndianBytes.ToBigIntegerFromBigEndianUnsignedBytes());

                result = new FiniteFieldPoint(x, y);
                return true;
            }
            catch(Exception exception) {
                result = null;
                return false;
            }
        }
 public FiniteFieldPolynomial(IrreduciblePolynomial primePolynomial, BigInteger polynomial) {
     _PrimePolynomial = primePolynomial;
     _PolynomialSetCoefficients = polynomial;
 }
Beispiel #9
0
 public FiniteFieldPolynomial(IrreduciblePolynomial primePolynomial, BigInteger polynomial)
 {
     _PrimePolynomial           = primePolynomial;
     _PolynomialSetCoefficients = polynomial;
 }
 public SplitSecret(SecretShareType shareType, int threshold, IrreduciblePolynomial irreduciblePolynomial, FiniteFieldPolynomial[] allCoefficients, SecureString passPhrase = null)
 {
     _ShareType = shareType;
     Threshold = threshold;
     _IrreduciblePolynomial = irreduciblePolynomial;
     _AllCoefficients = allCoefficients;
     _PassPhrase = passPhrase;
 }