Example #1
0
        public override ECPoint Twice()
        {
            if (base.IsInfinity)
            {
                return(this);
            }
            ECCurve        curve     = this.Curve;
            ECFieldElement rawXCoord = base.RawXCoord;

            if (rawXCoord.IsZero)
            {
                return(curve.Infinity);
            }
            ECFieldElement rawYCoord       = base.RawYCoord;
            ECFieldElement eCFieldElement  = base.RawZCoords[0];
            bool           isOne           = eCFieldElement.IsOne;
            ECFieldElement eCFieldElement2 = isOne ? rawYCoord : rawYCoord.Multiply(eCFieldElement);
            ECFieldElement b = isOne ? eCFieldElement : eCFieldElement.Square();
            ECFieldElement eCFieldElement3 = rawYCoord.Square().Add(eCFieldElement2).Add(b);

            if (eCFieldElement3.IsZero)
            {
                return(new SecT409R1Point(curve, eCFieldElement3, curve.B.Sqrt(), base.IsCompressed));
            }
            ECFieldElement eCFieldElement4 = eCFieldElement3.Square();
            ECFieldElement eCFieldElement5 = isOne ? eCFieldElement3 : eCFieldElement3.Multiply(b);
            ECFieldElement eCFieldElement6 = isOne ? rawXCoord : rawXCoord.Multiply(eCFieldElement);
            ECFieldElement y = eCFieldElement6.SquarePlusProduct(eCFieldElement3, eCFieldElement2).Add(eCFieldElement4).Add(eCFieldElement5);

            return(new SecT409R1Point(curve, eCFieldElement4, y, new ECFieldElement[]
            {
                eCFieldElement5
            }, base.IsCompressed));
        }
        public override ECPoint Twice()
        {
            if (base.IsInfinity)
            {
                return(this);
            }
            ECCurve        curve     = this.Curve;
            ECFieldElement rawXCoord = base.RawXCoord;

            if (rawXCoord.IsZero)
            {
                return(curve.Infinity);
            }
            ECFieldElement rawYCoord = base.RawYCoord;
            ECFieldElement b         = base.RawZCoords[0];
            bool           isOne     = b.IsOne;
            ECFieldElement element4  = !isOne?rawYCoord.Multiply(b) : rawYCoord;

            ECFieldElement element5 = !isOne?b.Square() : b;

            ECFieldElement x = rawYCoord.Square().Add(element4).Add(element5);

            if (x.IsZero)
            {
                return(new SecT409R1Point(curve, x, curve.B.Sqrt(), base.IsCompressed));
            }
            ECFieldElement element7 = x.Square();
            ECFieldElement element8 = !isOne?x.Multiply(element5) : x;

            ECFieldElement element9 = !isOne?rawXCoord.Multiply(b) : rawXCoord;

            ECFieldElement y = element9.SquarePlusProduct(x, element4).Add(element7).Add(element8);

            return(new SecT409R1Point(curve, element7, y, new ECFieldElement[] { element8 }, base.IsCompressed));
        }
Example #3
0
        public override ECPoint Twice()
        {
            if (base.IsInfinity)
            {
                return(this);
            }
            ECCurve        curve     = Curve;
            ECFieldElement rawXCoord = base.RawXCoord;

            if (rawXCoord.IsZero)
            {
                return(curve.Infinity);
            }
            ECFieldElement rawYCoord       = base.RawYCoord;
            ECFieldElement eCFieldElement  = base.RawZCoords[0];
            bool           isOne           = eCFieldElement.IsOne;
            ECFieldElement eCFieldElement2 = (!isOne) ? rawYCoord.Multiply(eCFieldElement) : rawYCoord;
            ECFieldElement b = (!isOne) ? eCFieldElement.Square() : eCFieldElement;
            ECFieldElement eCFieldElement3 = rawYCoord.Square().Add(eCFieldElement2).Add(b);

            if (eCFieldElement3.IsZero)
            {
                return(new SecT571R1Point(curve, eCFieldElement3, SecT571R1Curve.SecT571R1_B_SQRT, base.IsCompressed));
            }
            ECFieldElement eCFieldElement4 = eCFieldElement3.Square();
            ECFieldElement eCFieldElement5 = (!isOne) ? eCFieldElement3.Multiply(b) : eCFieldElement3;
            ECFieldElement eCFieldElement6 = (!isOne) ? rawXCoord.Multiply(eCFieldElement) : rawXCoord;
            ECFieldElement y = eCFieldElement6.SquarePlusProduct(eCFieldElement3, eCFieldElement2).Add(eCFieldElement4).Add(eCFieldElement5);

            return(new SecT571R1Point(curve, eCFieldElement4, y, new ECFieldElement[1]
            {
                eCFieldElement5
            }, base.IsCompressed));
        }
Example #4
0
        public override ECPoint Twice()
        {
            if (this.IsInfinity)
            {
                return this;
            }

            ECCurve curve = this.Curve;

            ECFieldElement X1 = this.RawXCoord;
            if (X1.IsZero)
            {
                // A point with X == 0 is it's own Additive inverse
                return curve.Infinity;
            }

            ECFieldElement L1 = this.RawYCoord, Z1 = this.RawZCoords[0];

            bool Z1IsOne = Z1.IsOne;
            ECFieldElement L1Z1 = Z1IsOne ? L1 : L1.Multiply(Z1);
            ECFieldElement Z1Sq = Z1IsOne ? Z1 : Z1.Square();
            ECFieldElement T = L1.Square().Add(L1Z1).Add(Z1Sq);
            if (T.IsZero)
            {
                return new SecT163R2Point(curve, T, curve.B.Sqrt(), IsCompressed);
            }

            ECFieldElement X3 = T.Square();
            ECFieldElement Z3 = Z1IsOne ? T : T.Multiply(Z1Sq);

            ECFieldElement X1Z1 = Z1IsOne ? X1 : X1.Multiply(Z1);
            ECFieldElement L3 = X1Z1.SquarePlusProduct(T, L1Z1).Add(X3).Add(Z3);

            return new SecT163R2Point(curve, X3, L3, new ECFieldElement[] { Z3 }, IsCompressed);
        }
    protected override bool SatisfiesCurveEquation()
    {
        ECCurve        curve            = Curve;
        ECFieldElement rawXCoord        = base.RawXCoord;
        ECFieldElement rawYCoord        = base.RawYCoord;
        ECFieldElement eCFieldElement   = curve.A;
        ECFieldElement eCFieldElement2  = curve.B;
        int            coordinateSystem = curve.CoordinateSystem;
        ECFieldElement eCFieldElement5;
        ECFieldElement eCFieldElement4;

        if (coordinateSystem == 6)
        {
            ECFieldElement eCFieldElement3 = base.RawZCoords[0];
            bool           isOne           = eCFieldElement3.IsOne;
            if (rawXCoord.IsZero)
            {
                eCFieldElement4 = rawYCoord.Square();
                eCFieldElement5 = eCFieldElement2;
                if (!isOne)
                {
                    ECFieldElement b = eCFieldElement3.Square();
                    eCFieldElement5 = eCFieldElement5.Multiply(b);
                }
            }
            else
            {
                ECFieldElement eCFieldElement6 = rawYCoord;
                ECFieldElement eCFieldElement7 = rawXCoord.Square();
                if (isOne)
                {
                    eCFieldElement4 = eCFieldElement6.Square().Add(eCFieldElement6).Add(eCFieldElement);
                    eCFieldElement5 = eCFieldElement7.Square().Add(eCFieldElement2);
                }
                else
                {
                    ECFieldElement eCFieldElement8 = eCFieldElement3.Square();
                    ECFieldElement y = eCFieldElement8.Square();
                    eCFieldElement4 = eCFieldElement6.Add(eCFieldElement3).MultiplyPlusProduct(eCFieldElement6, eCFieldElement, eCFieldElement8);
                    eCFieldElement5 = eCFieldElement7.SquarePlusProduct(eCFieldElement2, y);
                }
                eCFieldElement4 = eCFieldElement4.Multiply(eCFieldElement7);
            }
        }
        else
        {
            eCFieldElement4 = rawYCoord.Add(rawXCoord).Multiply(rawYCoord);
            switch (coordinateSystem)
            {
            case 1:
            {
                ECFieldElement eCFieldElement9 = base.RawZCoords[0];
                if (!eCFieldElement9.IsOne)
                {
                    ECFieldElement b2 = eCFieldElement9.Square();
                    ECFieldElement b3 = eCFieldElement9.Multiply(b2);
                    eCFieldElement4 = eCFieldElement4.Multiply(eCFieldElement9);
                    eCFieldElement  = eCFieldElement.Multiply(eCFieldElement9);
                    eCFieldElement2 = eCFieldElement2.Multiply(b3);
                }
                break;
            }

            default:
                throw new InvalidOperationException("unsupported coordinate system");

            case 0:
                break;
            }
            eCFieldElement5 = rawXCoord.Add(eCFieldElement).Multiply(rawXCoord.Square()).Add(eCFieldElement2);
        }
        return(eCFieldElement4.Equals(eCFieldElement5));
    }