コード例 #1
0
        public void TestClone()
        {
            var p = new CurvePoint(5, 5);
            var q = p.Clone();

            Assert.AreNotSame(p, q);
            Assert.AreEqual(p, q);
        }
コード例 #2
0
        public void TestAddDoublePoint()
        {
            var curve = TestCurveParameters.WeierstrassParameters.Equation;
            var p     = new CurvePoint(5, 5);
            var other = p.Clone();

            var expectedQ = new CurvePoint(15, 14);
            var q         = curve.Add(p, other);

            Assert.AreEqual(expectedQ, q);
        }
コード例 #3
0
        public void TestEquals()
        {
            var p = new CurvePoint(11, 0);
            var q = new CurvePoint(3, 4);

            Assert.AreEqual(p, p, "same");
            Assert.AreEqual(p, p.Clone(), "equal");
            Assert.AreEqual(CurvePoint.PointAtInfinity, CurvePoint.PointAtInfinity, "at inf");

            Assert.AreNotEqual(p, q, "not equal");
            Assert.AreNotEqual(q, p, "not equal reversed");
        }
コード例 #4
0
        public void TestAreNegationsFalseForEqualPoint()
        {
            var equation = new Mock <CurveEquation>(
                BigPrime.CreateWithoutChecks(23),
                BigInteger.Zero, BigInteger.One
                )
            {
                CallBase = true
            };

            var testElement  = new CurvePoint(5, 5);
            var otherElement = testElement.Clone();

            Assert.IsFalse(equation.Object.AreNegations(testElement, otherElement));
        }
コード例 #5
0
        /// <inheritdoc/>
        public override CurvePoint Add(CurvePoint left, CurvePoint right)
        {
            BigInteger x1 = left.X;
            BigInteger x2 = right.X;
            BigInteger y1 = left.Y;
            BigInteger y2 = right.Y;

            BigInteger lambda;

            if (left.Equals(right))
            {
                lambda = Field.Mod((3 * Field.Square(x1) + 2 * A * x1 + 1) * Field.InvertMult(2 * B * y1));
            }
            else
            {
                lambda = Field.Mod((y2 - y1) * Field.InvertMult(x2 - x1));
            }
            BigInteger x3 = Field.Mod(B * Field.Square(lambda) - x1 - x2 - A);
            BigInteger y3 = Field.Mod(lambda * (x1 - x3) - y1);

            CurvePoint result             = CurvePoint.PointAtInfinity;
            bool       pointsAreNegations = AreNegations(left, right);

            if (left.IsAtInfinity && right.IsAtInfinity)
            {
                result = CurvePoint.PointAtInfinity;
            }
            if (left.IsAtInfinity && !right.IsAtInfinity)
            {
                result = right.Clone();
            }
            if (right.IsAtInfinity && !left.IsAtInfinity)
            {
                result = left.Clone();
            }
            if (!left.IsAtInfinity && !right.IsAtInfinity && pointsAreNegations)
            {
                result = CurvePoint.PointAtInfinity;
            }
            if (!left.IsAtInfinity && !right.IsAtInfinity && !pointsAreNegations)
            {
                result = new CurvePoint(x3, y3);
            }
            return(result);
        }