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

            if (!rawXCoord.IsZero)
            {
                switch (curve.CoordinateSystem)
                {
                case 0:
                {
                    ECFieldElement rawYCoord2       = base.RawYCoord;
                    ECFieldElement eCFieldElement11 = rawYCoord2.Divide(rawXCoord).Add(rawXCoord);
                    ECFieldElement x = eCFieldElement11.Square().Add(eCFieldElement11).Add(curve.A);
                    ECFieldElement y = rawXCoord.SquarePlusProduct(x, eCFieldElement11.AddOne());
                    return(new F2mPoint(curve, x, y, base.IsCompressed));
                }

                case 1:
                {
                    ECFieldElement rawYCoord3       = base.RawYCoord;
                    ECFieldElement eCFieldElement12 = base.RawZCoords[0];
                    bool           isOne2           = eCFieldElement12.IsOne;
                    ECFieldElement eCFieldElement13 = (!isOne2) ? rawXCoord.Multiply(eCFieldElement12) : rawXCoord;
                    ECFieldElement b3 = (!isOne2) ? rawYCoord3.Multiply(eCFieldElement12) : rawYCoord3;
                    ECFieldElement eCFieldElement14 = rawXCoord.Square();
                    ECFieldElement eCFieldElement15 = eCFieldElement14.Add(b3);
                    ECFieldElement eCFieldElement16 = eCFieldElement13;
                    ECFieldElement eCFieldElement17 = eCFieldElement16.Square();
                    ECFieldElement eCFieldElement18 = eCFieldElement15.Add(eCFieldElement16);
                    ECFieldElement eCFieldElement19 = eCFieldElement18.MultiplyPlusProduct(eCFieldElement15, eCFieldElement17, curve.A);
                    ECFieldElement x2 = eCFieldElement16.Multiply(eCFieldElement19);
                    ECFieldElement y2 = eCFieldElement14.Square().MultiplyPlusProduct(eCFieldElement16, eCFieldElement19, eCFieldElement18);
                    ECFieldElement eCFieldElement20 = eCFieldElement16.Multiply(eCFieldElement17);
                    return(new F2mPoint(curve, x2, y2, new ECFieldElement[1]
                        {
                            eCFieldElement20
                        }, base.IsCompressed));
                }

                case 6:
                {
                    ECFieldElement rawYCoord       = base.RawYCoord;
                    ECFieldElement eCFieldElement  = base.RawZCoords[0];
                    bool           isOne           = eCFieldElement.IsOne;
                    ECFieldElement eCFieldElement2 = (!isOne) ? rawYCoord.Multiply(eCFieldElement) : rawYCoord;
                    ECFieldElement eCFieldElement3 = (!isOne) ? eCFieldElement.Square() : eCFieldElement;
                    ECFieldElement a = curve.A;
                    ECFieldElement eCFieldElement4 = (!isOne) ? a.Multiply(eCFieldElement3) : a;
                    ECFieldElement eCFieldElement5 = rawYCoord.Square().Add(eCFieldElement2).Add(eCFieldElement4);
                    if (eCFieldElement5.IsZero)
                    {
                        return(new F2mPoint(curve, eCFieldElement5, curve.B.Sqrt(), base.IsCompressed));
                    }
                    ECFieldElement eCFieldElement6 = eCFieldElement5.Square();
                    ECFieldElement eCFieldElement7 = (!isOne) ? eCFieldElement5.Multiply(eCFieldElement3) : eCFieldElement5;
                    ECFieldElement b = curve.B;
                    ECFieldElement eCFieldElement9;
                    if (b.BitLength < curve.FieldSize >> 1)
                    {
                        ECFieldElement eCFieldElement8 = rawYCoord.Add(rawXCoord).Square();
                        ECFieldElement b2 = (!b.IsOne) ? eCFieldElement4.SquarePlusProduct(b, eCFieldElement3.Square()) : eCFieldElement4.Add(eCFieldElement3).Square();
                        eCFieldElement9 = eCFieldElement8.Add(eCFieldElement5).Add(eCFieldElement3).Multiply(eCFieldElement8)
                                          .Add(b2)
                                          .Add(eCFieldElement6);
                        if (a.IsZero)
                        {
                            eCFieldElement9 = eCFieldElement9.Add(eCFieldElement7);
                        }
                        else if (!a.IsOne)
                        {
                            eCFieldElement9 = eCFieldElement9.Add(a.AddOne().Multiply(eCFieldElement7));
                        }
                    }
                    else
                    {
                        ECFieldElement eCFieldElement10 = (!isOne) ? rawXCoord.Multiply(eCFieldElement) : rawXCoord;
                        eCFieldElement9 = eCFieldElement10.SquarePlusProduct(eCFieldElement5, eCFieldElement2).Add(eCFieldElement6).Add(eCFieldElement7);
                    }
                    return(new F2mPoint(curve, eCFieldElement6, eCFieldElement9, new ECFieldElement[1]
                        {
                            eCFieldElement7
                        }, base.IsCompressed));
                }

                default:
                    throw new InvalidOperationException("unsupported coordinate system");
                }
            }
            return(curve.Infinity);
        }
        protected override bool SatisfiesCurveEquation()
        {
            //IL_0167: Unknown result type (might be due to invalid IL or missing references)
            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));
        }
示例#3
0
        public override ECPoint Twice()
        {
            ECFieldElement element26;
            ECFieldElement element27;
            ECFieldElement element29;

            if (base.IsInfinity)
            {
                return(this);
            }
            ECCurve        curve     = this.Curve;
            ECFieldElement rawXCoord = base.RawXCoord;

            if (rawXCoord.IsZero)
            {
                return(curve.Infinity);
            }
            switch (curve.CoordinateSystem)
            {
            case 0:
            {
                ECFieldElement b = base.RawYCoord.Divide(rawXCoord).Add(rawXCoord);
                ECFieldElement x = b.Square().Add(b).Add(curve.A);
                return(new F2mPoint(curve, x, rawXCoord.SquarePlusProduct(x, b.AddOne()), base.IsCompressed));
            }

            case 1:
            {
                ECFieldElement rawYCoord = base.RawYCoord;
                ECFieldElement b         = base.RawZCoords[0];
                bool           isOne     = b.IsOne;
                ECFieldElement element8  = !isOne?rawXCoord.Multiply(b) : rawXCoord;

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

                ECFieldElement element10 = rawXCoord.Square();
                ECFieldElement element11 = element10.Add(element9);
                ECFieldElement element12 = element8;
                ECFieldElement x         = element12.Square();
                ECFieldElement y         = element11.Add(element12);
                ECFieldElement element15 = y.MultiplyPlusProduct(element11, x, curve.A);
                ECFieldElement element16 = element12.Multiply(element15);
                ECFieldElement element17 = element10.Square().MultiplyPlusProduct(element12, element15, y);
                ECFieldElement element18 = element12.Multiply(x);
                return(new F2mPoint(curve, element16, element17, new ECFieldElement[] { element18 }, base.IsCompressed));
            }

            case 6:
            {
                ECFieldElement element31;
                ECFieldElement rawYCoord = base.RawYCoord;
                ECFieldElement b         = base.RawZCoords[0];
                bool           isOne     = b.IsOne;
                ECFieldElement element21 = !isOne?rawYCoord.Multiply(b) : rawYCoord;

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

                ECFieldElement a         = curve.A;
                ECFieldElement element24 = !isOne?a.Multiply(element22) : a;

                ECFieldElement x = rawYCoord.Square().Add(element21).Add(element24);
                if (x.IsZero)
                {
                    return(new F2mPoint(curve, x, curve.B.Sqrt(), base.IsCompressed));
                }
                element26 = x.Square();
                element27 = !isOne?x.Multiply(element22) : x;

                ECFieldElement element28 = curve.B;
                if (element28.BitLength >= (curve.FieldSize >> 1))
                {
                    ECFieldElement element32 = !isOne?rawXCoord.Multiply(b) : rawXCoord;

                    element29 = element32.SquarePlusProduct(x, element21).Add(element26).Add(element27);
                    break;
                }
                ECFieldElement element30 = rawYCoord.Add(rawXCoord).Square();
                if (element28.IsOne)
                {
                    element31 = element24.Add(element22).Square();
                }
                else
                {
                    element31 = element24.SquarePlusProduct(element28, element22.Square());
                }
                element29 = element30.Add(x).Add(element22).Multiply(element30).Add(element31).Add(element26);
                if (a.IsZero)
                {
                    element29 = element29.Add(element27);
                }
                else if (!a.IsOne)
                {
                    element29 = element29.Add(a.AddOne().Multiply(element27));
                }
                break;
            }

            default:
                throw new InvalidOperationException("unsupported coordinate system");
            }
            return(new F2mPoint(curve, element26, element29, new ECFieldElement[] { element27 }, base.IsCompressed));
        }
        protected override bool SatisfiesCurveEquation()
        {
            ECFieldElement element5;
            ECFieldElement element6;
            ECCurve        curve            = this.Curve;
            ECFieldElement rawXCoord        = base.RawXCoord;
            ECFieldElement rawYCoord        = base.RawYCoord;
            ECFieldElement a                = curve.A;
            ECFieldElement b                = curve.B;
            int            coordinateSystem = curve.CoordinateSystem;

            if (coordinateSystem == 6)
            {
                ECFieldElement element7 = base.RawZCoords[0];
                bool           isOne    = element7.IsOne;
                if (rawXCoord.IsZero)
                {
                    element5 = rawYCoord.Square();
                    element6 = b;
                    if (!isOne)
                    {
                        ECFieldElement element8 = element7.Square();
                        element6 = element6.Multiply(element8);
                    }
                }
                else
                {
                    ECFieldElement element9  = rawYCoord;
                    ECFieldElement element10 = rawXCoord.Square();
                    if (isOne)
                    {
                        element5 = element9.Square().Add(element9).Add(a);
                        element6 = element10.Square().Add(b);
                    }
                    else
                    {
                        ECFieldElement y         = element7.Square();
                        ECFieldElement element12 = y.Square();
                        element5 = element9.Add(element7).MultiplyPlusProduct(element9, a, y);
                        element6 = element10.SquarePlusProduct(b, element12);
                    }
                    element5 = element5.Multiply(element10);
                }
            }
            else
            {
                element5 = rawYCoord.Add(rawXCoord).Multiply(rawYCoord);
                if (coordinateSystem != 0)
                {
                    if (coordinateSystem != 1)
                    {
                        throw new InvalidOperationException("unsupported coordinate system");
                    }
                    ECFieldElement element13 = base.RawZCoords[0];
                    if (!element13.IsOne)
                    {
                        ECFieldElement element14 = element13.Square();
                        ECFieldElement element15 = element13.Multiply(element14);
                        element5 = element5.Multiply(element13);
                        a        = a.Multiply(element13);
                        b        = b.Multiply(element15);
                    }
                }
                element6 = rawXCoord.Add(a).Multiply(rawXCoord.Square()).Add(b);
            }
            return(element5.Equals(element6));
        }
示例#5
0
        public override ECPoint Twice()
        {
            if (base.IsInfinity)
            {
                return(this);
            }
            ECCurve        curve     = this.Curve;
            ECFieldElement rawXCoord = base.RawXCoord;

            if (rawXCoord.IsZero)
            {
                return(curve.Infinity);
            }
            int coordinateSystem = curve.CoordinateSystem;
            int num = coordinateSystem;

            switch (num)
            {
            case 0:
            {
                ECFieldElement rawYCoord      = base.RawYCoord;
                ECFieldElement eCFieldElement = rawYCoord.Divide(rawXCoord).Add(rawXCoord);
                ECFieldElement x = eCFieldElement.Square().Add(eCFieldElement).Add(curve.A);
                ECFieldElement y = rawXCoord.SquarePlusProduct(x, eCFieldElement.AddOne());
                return(new F2mPoint(curve, x, y, base.IsCompressed));
            }

            case 1:
            {
                ECFieldElement rawYCoord2      = base.RawYCoord;
                ECFieldElement eCFieldElement2 = base.RawZCoords[0];
                bool           isOne           = eCFieldElement2.IsOne;
                ECFieldElement eCFieldElement3 = isOne ? rawXCoord : rawXCoord.Multiply(eCFieldElement2);
                ECFieldElement b = isOne ? rawYCoord2 : rawYCoord2.Multiply(eCFieldElement2);
                ECFieldElement eCFieldElement4 = rawXCoord.Square();
                ECFieldElement eCFieldElement5 = eCFieldElement4.Add(b);
                ECFieldElement eCFieldElement6 = eCFieldElement3;
                ECFieldElement eCFieldElement7 = eCFieldElement6.Square();
                ECFieldElement eCFieldElement8 = eCFieldElement5.Add(eCFieldElement6);
                ECFieldElement eCFieldElement9 = eCFieldElement8.MultiplyPlusProduct(eCFieldElement5, eCFieldElement7, curve.A);
                ECFieldElement x2 = eCFieldElement6.Multiply(eCFieldElement9);
                ECFieldElement y2 = eCFieldElement4.Square().MultiplyPlusProduct(eCFieldElement6, eCFieldElement9, eCFieldElement8);
                ECFieldElement eCFieldElement10 = eCFieldElement6.Multiply(eCFieldElement7);
                return(new F2mPoint(curve, x2, y2, new ECFieldElement[]
                    {
                        eCFieldElement10
                    }, base.IsCompressed));
            }

            default:
            {
                if (num != 6)
                {
                    throw new InvalidOperationException("unsupported coordinate system");
                }
                ECFieldElement rawYCoord3       = base.RawYCoord;
                ECFieldElement eCFieldElement11 = base.RawZCoords[0];
                bool           isOne2           = eCFieldElement11.IsOne;
                ECFieldElement eCFieldElement12 = isOne2 ? rawYCoord3 : rawYCoord3.Multiply(eCFieldElement11);
                ECFieldElement eCFieldElement13 = isOne2 ? eCFieldElement11 : eCFieldElement11.Square();
                ECFieldElement a = curve.A;
                ECFieldElement eCFieldElement14 = isOne2 ? a : a.Multiply(eCFieldElement13);
                ECFieldElement eCFieldElement15 = rawYCoord3.Square().Add(eCFieldElement12).Add(eCFieldElement14);
                if (eCFieldElement15.IsZero)
                {
                    return(new F2mPoint(curve, eCFieldElement15, curve.B.Sqrt(), base.IsCompressed));
                }
                ECFieldElement eCFieldElement16 = eCFieldElement15.Square();
                ECFieldElement eCFieldElement17 = isOne2 ? eCFieldElement15 : eCFieldElement15.Multiply(eCFieldElement13);
                ECFieldElement b2 = curve.B;
                ECFieldElement eCFieldElement19;
                if (b2.BitLength < curve.FieldSize >> 1)
                {
                    ECFieldElement eCFieldElement18 = rawYCoord3.Add(rawXCoord).Square();
                    ECFieldElement b3;
                    if (b2.IsOne)
                    {
                        b3 = eCFieldElement14.Add(eCFieldElement13).Square();
                    }
                    else
                    {
                        b3 = eCFieldElement14.SquarePlusProduct(b2, eCFieldElement13.Square());
                    }
                    eCFieldElement19 = eCFieldElement18.Add(eCFieldElement15).Add(eCFieldElement13).Multiply(eCFieldElement18).Add(b3).Add(eCFieldElement16);
                    if (a.IsZero)
                    {
                        eCFieldElement19 = eCFieldElement19.Add(eCFieldElement17);
                    }
                    else if (!a.IsOne)
                    {
                        eCFieldElement19 = eCFieldElement19.Add(a.AddOne().Multiply(eCFieldElement17));
                    }
                }
                else
                {
                    ECFieldElement eCFieldElement20 = isOne2 ? rawXCoord : rawXCoord.Multiply(eCFieldElement11);
                    eCFieldElement19 = eCFieldElement20.SquarePlusProduct(eCFieldElement15, eCFieldElement12).Add(eCFieldElement16).Add(eCFieldElement17);
                }
                return(new F2mPoint(curve, eCFieldElement16, eCFieldElement19, new ECFieldElement[]
                    {
                        eCFieldElement17
                    }, base.IsCompressed));
            }
            }
        }