public CurveGroupAlgebraTests() { curveEquationMock = new Mock <CurveEquation>( BigPrime.CreateWithoutChecks(23), BigInteger.Zero, BigInteger.One ) { CallBase = true }; curveParameters = new CurveParameters( curveEquation: curveEquationMock.Object, generator: TestCurveParameters.WeierstrassParameters.Generator, order: TestCurveParameters.WeierstrassParameters.Order, cofactor: TestCurveParameters.WeierstrassParameters.Cofactor ); largeCurveEquationMock = new Mock <CurveEquation>( BigPrime.CreateWithoutChecks(18392027), BigInteger.Zero, BigInteger.One ) { CallBase = true }; // 25 bits prime largeParameters = new CurveParameters( curveEquation: largeCurveEquationMock.Object, generator: new CurvePoint(), order: BigPrime.CreateWithoutChecks(2), cofactor: BigInteger.One ); }
public void TestEqualsIsFalseForUnrelatedObject() { var order = BigPrime.CreateWithoutChecks(7); var cofactor = new BigInteger(2); var generator = CurvePoint.PointAtInfinity; CurveParameters parameters = new CurveParameters( equationMock.Object, generator, order, cofactor ); Assert.AreNotEqual(parameters, new object()); }
/// <summary> /// Initializes a new instance of <see cref="XOnlyMontgomeryCurveAlgebra"/> /// with given curve parameters. /// </summary> /// <param name="parameters">The parameters of the elliptic curve.</param> public XOnlyMontgomeryCurveAlgebra(CurveParameters parameters) : base( parameters.Generator.X, parameters.Order, parameters.Cofactor, BigInteger.Zero, NumberLength.GetLength(parameters.Equation.Field.Modulo).InBits ) { _parameters = parameters; _aConstant = Field.Mod((_parameters.Equation.A + 2) * Field.InvertMult(4)); }
public XOnlyMontgomeryCurveAlgebraTests() { largeParameters = new CurveParameters( curveEquation: new MontgomeryCurveEquation( prime: BigPrime.CreateWithoutChecks(18392027), // 25 bits a: 0, b: 0 ), generator: CurvePoint.PointAtInfinity, order: BigPrime.CreateWithoutChecks(3), cofactor: 1 ); }
public void TestInvalidElementRejectedAsGenerator() { var invalidGenerator = new CurvePoint(16, 1); CurveParameters invalidParameters = new CurveParameters( curveEquation: TestCurveParameters.WeierstrassParameters.Equation, generator: invalidGenerator, order: curveParameters.Order, cofactor: curveParameters.Cofactor ); Assert.Throws <ArgumentException>( () => new CurveGroupAlgebra(invalidParameters) ); }
public void TestIsElementForPointAtInfinityCofactorOne() { var parameters = new CurveParameters( curveParameters.Equation, curveParameters.Generator, curveParameters.Order, BigInteger.One ); var curve = new CurveGroupAlgebra(parameters); curveEquationMock.Setup(eq => eq.Add(It.IsAny <CurvePoint>(), It.IsAny <CurvePoint>())).Returns(CurvePoint.PointAtInfinity); Assert.IsTrue(curve.IsPotentialElement(CurvePoint.PointAtInfinity), "IsPotentialElement not true for point at infinity!"); Assert.IsFalse(curve.IsSafeElement(CurvePoint.PointAtInfinity), "IsSafeElement not false for point at infinity!"); }
public void TestEqualsIsTrueForEqualObjects() { var order = BigPrime.CreateWithoutChecks(7); var cofactor = new BigInteger(2); var generator = CurvePoint.PointAtInfinity; CurveParameters parameters = new CurveParameters( equationMock.Object, generator, order, cofactor ); CurveParameters otherParameters = new CurveParameters( equationMock.Object, generator, order, cofactor ); Assert.AreEqual(parameters, otherParameters); }
/// <summary> /// Initializes a new instance of the <see cref="CurveGroupAlgebra"/> class. /// </summary> /// <param name="parameters">The parameters of the elliptic curve.</param> public CurveGroupAlgebra(CurveParameters parameters) : base( parameters.Generator, parameters.Order, parameters.Cofactor, CurvePoint.PointAtInfinity, 2 * NumberLength.GetLength(parameters.Equation.Field.Modulo).InBits ) { _curveEquation = parameters.Equation; if (!IsSafeElement(Generator)) { throw new ArgumentException("The point given as generator is " + "not a valid point on the curve.", nameof(parameters)); } }
public void TestEqualsIsFalseForDifferentObjects() { var equation = equationMock.Object; equationMock.Reset(); equationMock.Setup(eq => eq.Equals(It.IsAny <CurveEquation>())).Returns(false); var order = BigPrime.CreateWithoutChecks(7); var cofactor = new BigInteger(2); var generator = CurvePoint.PointAtInfinity; CurveParameters parameters = new CurveParameters( equation, generator, order, cofactor ); CurveParameters otherParameters = new CurveParameters( equation, generator, order, cofactor ); Assert.AreNotEqual(parameters, otherParameters); equationMock.Reset(); equationMock.Setup(eq => eq.Equals(It.IsAny <CurveEquation>())).Returns(true); otherParameters = new CurveParameters( equation, new CurvePoint(1, 1), order, cofactor ); Assert.AreNotEqual(parameters, otherParameters); otherParameters = new CurveParameters( equation, generator, BigPrime.CreateWithoutChecks(3), cofactor ); Assert.AreNotEqual(parameters, otherParameters); otherParameters = new CurveParameters( equation, generator, order, BigInteger.One ); Assert.AreNotEqual(parameters, otherParameters); }
/// <summary> /// Creates a <see cref="CryptoGroup{BigInteger, BigInteger}" /> instance using a <see cref="XOnlyMontgomeryCurveAlgebra" /> /// instance with the given <see cref="CurveParameters"/>. /// </summary> /// <param name="parameters">The parameters of the elliptic curve.</param> public static CryptoGroup <BigInteger, BigInteger> CreateCryptoGroup(CurveParameters parameters) { return(new CryptoGroup <BigInteger, BigInteger>( new XOnlyMontgomeryCurveAlgebra(parameters) )); }
/// <summary> /// Creates a <see cref="CryptoGroup{BigInteger, CurvePoint}" /> instance using a <see cref="CurveGroupAlgebra" /> /// instance with the given <see cref="CurveParameters"/>. /// </summary> /// <param name="parameters">The parameters of the elliptic curve.</param> public static CryptoGroup <BigInteger, CurvePoint> CreateCryptoGroup(CurveParameters parameters) { return(new CryptoGroup <BigInteger, CurvePoint>(new CurveGroupAlgebra(parameters))); }