示例#1
0
        protected override ECPoint DecompressPoint(int yTilde, BigInteger X1)
        {
            ECFieldElement xp = FromBigInteger(X1), yp;

            if (xp.IsZero)
            {
                yp = m_b.Sqrt();
            }
            else
            {
                ECFieldElement beta = xp.Square().Invert().Multiply(B).Add(A).Add(xp);
                ECFieldElement z    = SolveQuadradicEquation(beta);

                if (z == null)
                {
                    throw new ArithmeticException("Invalid point compression");
                }

                if (z.TestBitZero() != (yTilde == 1))
                {
                    z = z.AddOne();
                }

                switch (this.CoordinateSystem)
                {
                case COORD_LAMBDA_AFFINE:
                case COORD_LAMBDA_PROJECTIVE:
                {
                    yp = z.Add(xp);
                    break;
                }

                default:
                {
                    yp = z.Multiply(xp);
                    break;
                }
                }
            }

            return(new F2mPoint(this, xp, yp, true));
        }
        protected override ECPoint DecompressPoint(int yTilde, BigInteger X1)
        {
            //IL_009b: Unknown result type (might be due to invalid IL or missing references)
            ECFieldElement eCFieldElement  = FromBigInteger(X1);
            ECFieldElement eCFieldElement2 = null;

            if (eCFieldElement.IsZero)
            {
                eCFieldElement2 = B.Sqrt();
            }
            else
            {
                ECFieldElement beta = eCFieldElement.Square().Invert().Multiply(B)
                                      .Add(A)
                                      .Add(eCFieldElement);
                ECFieldElement eCFieldElement3 = SolveQuadradicEquation(beta);
                if (eCFieldElement3 != null)
                {
                    if (eCFieldElement3.TestBitZero() != (yTilde == 1))
                    {
                        eCFieldElement3 = eCFieldElement3.AddOne();
                    }
                    switch (CoordinateSystem)
                    {
                    case 5:
                    case 6:
                        eCFieldElement2 = eCFieldElement3.Add(eCFieldElement);
                        break;

                    default:
                        eCFieldElement2 = eCFieldElement3.Multiply(eCFieldElement);
                        break;
                    }
                }
            }
            if (eCFieldElement2 == null)
            {
                throw new ArgumentException("Invalid point compression");
            }
            return(CreateRawPoint(eCFieldElement, eCFieldElement2, withCompression: true));
        }
示例#3
0
        protected override ECPoint DecompressPoint(int yTilde, BigInteger X1)
        {
            ECFieldElement x   = FromBigInteger(X1);
            ECFieldElement rhs = x.Square().Add(A).Multiply(x).Add(B);
            ECFieldElement y   = rhs.Sqrt();

            /*
             * If y is not a square, then we haven't got a point on the curve
             */
            if (y == null)
            {
                throw new ArgumentException("Invalid point compression");
            }

            if (y.TestBitZero() != (yTilde == 1))
            {
                // Use the other root
                y = y.Negate();
            }

            return(CreateRawPoint(x, y, true));
        }
示例#4
0
        protected override ECPoint DecompressPoint(int yTilde, BigInteger X1)
        {
            ECFieldElement eCFieldElement  = this.FromBigInteger(X1);
            ECFieldElement eCFieldElement2 = null;

            if (eCFieldElement.IsZero)
            {
                eCFieldElement2 = this.m_b.Sqrt();
            }
            else
            {
                ECFieldElement beta            = eCFieldElement.Square().Invert().Multiply(this.B).Add(this.A).Add(eCFieldElement);
                ECFieldElement eCFieldElement3 = this.SolveQuadradicEquation(beta);
                if (eCFieldElement3 != null)
                {
                    if (eCFieldElement3.TestBitZero() != (yTilde == 1))
                    {
                        eCFieldElement3 = eCFieldElement3.AddOne();
                    }
                    switch (this.CoordinateSystem)
                    {
                    case 5:
                    case 6:
                        eCFieldElement2 = eCFieldElement3.Add(eCFieldElement);
                        break;

                    default:
                        eCFieldElement2 = eCFieldElement3.Multiply(eCFieldElement);
                        break;
                    }
                }
            }
            if (eCFieldElement2 == null)
            {
                throw new ArgumentException("Invalid point compression");
            }
            return(this.CreateRawPoint(eCFieldElement, eCFieldElement2, true));
        }
示例#5
0
        protected override ECPoint DecompressPoint(int yTilde, BigInteger X1)
        {
            ECFieldElement x     = FromBigInteger(X1);
            ECFieldElement alpha = x.Square().Add(m_a).Multiply(x).Add(m_b);
            ECFieldElement beta  = alpha.Sqrt();

            //
            // if we can't find a sqrt we haven't got a point on the
            // curve - run!
            //
            if (beta == null)
            {
                throw new ArithmeticException("Invalid point compression");
            }

            if (beta.TestBitZero() != (yTilde == 1))
            {
                // Use the other root
                beta = beta.Negate();
            }

            return(new FpPoint(this, x, beta, true));
        }
        protected override ECPoint DecompressPoint(int yTilde, BigInteger X1)
        {
            ECFieldElement b = this.FromBigInteger(X1);
            ECFieldElement y = null;

            if (b.IsZero)
            {
                y = this.B.Sqrt();
            }
            else
            {
                ECFieldElement beta     = b.Square().Invert().Multiply(this.B).Add(this.A).Add(b);
                ECFieldElement element4 = this.SolveQuadradicEquation(beta);
                if (element4 != null)
                {
                    if (element4.TestBitZero() != (yTilde == 1))
                    {
                        element4 = element4.AddOne();
                    }
                    switch (this.CoordinateSystem)
                    {
                    case 5:
                    case 6:
                        y = element4.Add(b);
                        goto Label_00A9;
                    }
                    y = element4.Multiply(b);
                }
            }
Label_00A9:
            if (y == null)
            {
                throw new ArgumentException("Invalid point compression");
            }
            return(this.CreateRawPoint(b, y, true));
        }