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()); } }
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)); }
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; }
public SplitSecret(SecretShareType shareType, int threshold, IrreduciblePolynomial irreduciblePolynomial, FiniteFieldPolynomial[] allCoefficients, SecureString passPhrase = null) { _ShareType = shareType; Threshold = threshold; _IrreduciblePolynomial = irreduciblePolynomial; _AllCoefficients = allCoefficients; _PassPhrase = passPhrase; }