Esempio n. 1
0
 public static void Invert(ulong[] x, ulong[] z)
 {
     //IL_0008: Unknown result type (might be due to invalid IL or missing references)
     if (Nat320.IsZero64(x))
     {
         throw new InvalidOperationException();
     }
     ulong[] array  = Nat320.Create64();
     ulong[] array2 = Nat320.Create64();
     Square(x, array);
     Multiply(array, x, array);
     SquareN(array, 2, array2);
     Multiply(array2, array, array2);
     SquareN(array2, 4, array);
     Multiply(array, array2, array);
     SquareN(array, 8, array2);
     Multiply(array2, array, array2);
     Square(array2, array2);
     Multiply(array2, x, array2);
     SquareN(array2, 17, array);
     Multiply(array, array2, array);
     Square(array, array);
     Multiply(array, x, array);
     SquareN(array, 35, array2);
     Multiply(array2, array, array2);
     SquareN(array2, 70, array);
     Multiply(array, array2, array);
     Square(array, array);
     Multiply(array, x, array);
     SquareN(array, 141, array2);
     Multiply(array2, array, array2);
     Square(array2, z);
 }
        public static void Sqrt(ulong[] x, ulong[] z)
        {
            ulong[] odd = Nat320.Create64();

            ulong u0, u1;

            u0 = Interleave.Unshuffle(x[0]); u1 = Interleave.Unshuffle(x[1]);
            ulong e0 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);

            odd[0] = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);

            u0 = Interleave.Unshuffle(x[2]); u1 = Interleave.Unshuffle(x[3]);
            ulong e1 = (u0 & 0x00000000FFFFFFFFUL) | (u1 << 32);

            odd[1] = (u0 >> 32) | (u1 & 0xFFFFFFFF00000000UL);

            u0 = Interleave.Unshuffle(x[4]);
            ulong e2 = (u0 & 0x00000000FFFFFFFFUL);

            odd[2] = (u0 >> 32);

            Multiply(odd, ROOT_Z, z);

            z[0] ^= e0;
            z[1] ^= e1;
            z[2] ^= e2;
        }
Esempio n. 3
0
 public override ECFieldElement SquarePow(int pow)
 {
     if (pow < 1)
     {
         return(this);
     }
     ulong[] z = Nat320.Create64();
     SecT283Field.SquareN(this.x, pow, z);
     return(new SecT283FieldElement(z));
 }
 public virtual bool Equals(SecT283FieldElement other)
 {
     if (this == other)
     {
         return(true);
     }
     if (null == other)
     {
         return(false);
     }
     return(Nat320.Eq64(x, other.x));
 }
Esempio n. 5
0
 public override ECFieldElement SquarePlusProduct(ECFieldElement x, ECFieldElement y)
 {
     ulong[] array  = this.x;
     ulong[] array2 = ((SecT283FieldElement)x).x;
     ulong[] y2     = ((SecT283FieldElement)y).x;
     ulong[] array3 = Nat.Create64(9);
     SecT283Field.SquareAddToExt(array, array3);
     SecT283Field.MultiplyAddToExt(array2, y2, array3);
     ulong[] z = Nat320.Create64();
     SecT283Field.Reduce(array3, z);
     return(new SecT283FieldElement(z));
 }
        public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
        {
            ulong[] ax = this.x, bx = ((SecT283FieldElement)b).x;
            ulong[] xx = ((SecT283FieldElement)x).x, yx = ((SecT283FieldElement)y).x;

            ulong[] tt = Nat.Create64(9);
            SecT283Field.MultiplyAddToExt(ax, bx, tt);
            SecT283Field.MultiplyAddToExt(xx, yx, tt);

            ulong[] z = Nat320.Create64();
            SecT283Field.Reduce(tt, z);
            return(new SecT283FieldElement(z));
        }
Esempio n. 7
0
            public override ECPoint LookupVar(int index)
            {
                ulong[] x   = Nat320.Create64(), y = Nat320.Create64();
                int     pos = index * SECT283R1_FE_LONGS * 2;

                for (int j = 0; j < SECT283R1_FE_LONGS; ++j)
                {
                    x[j] = m_table[pos + j];
                    y[j] = m_table[pos + SECT283R1_FE_LONGS + j];
                }

                return(CreatePoint(x, y));
            }
 public override ECFieldElement MultiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y)
 {
     ulong[] numArray  = this.x;
     ulong[] numArray2 = ((SecT283FieldElement)b).x;
     ulong[] numArray3 = ((SecT283FieldElement)x).x;
     ulong[] numArray4 = ((SecT283FieldElement)y).x;
     ulong[] zz        = Nat.Create64(9);
     SecT283Field.MultiplyAddToExt(numArray, numArray2, zz);
     SecT283Field.MultiplyAddToExt(numArray3, numArray4, zz);
     ulong[] z = Nat320.Create64();
     SecT283Field.Reduce(zz, z);
     return(new SecT283FieldElement(z));
 }
        public static void HalfTrace(ulong[] x, ulong[] z)
        {
            ulong[] tt = Nat.Create64(9);

            Nat320.Copy64(x, z);
            for (int i = 1; i < 283; i += 2)
            {
                ImplSquare(z, tt);
                Reduce(tt, z);
                ImplSquare(z, tt);
                Reduce(tt, z);
                AddTo(x, z);
            }
        }
Esempio n. 10
0
        public override ECLookupTable CreateCacheSafeLookupTable(ECPoint[] points, int off, int len)
        {
            ulong[] table = new ulong[len * SECT283R1_FE_LONGS * 2];
            {
                int pos = 0;
                for (int i = 0; i < len; ++i)
                {
                    ECPoint p = points[off + i];
                    Nat320.Copy64(((SecT283FieldElement)p.RawXCoord).x, 0, table, pos); pos += SECT283R1_FE_LONGS;
                    Nat320.Copy64(((SecT283FieldElement)p.RawYCoord).x, 0, table, pos); pos += SECT283R1_FE_LONGS;
                }
            }

            return(new SecT283R1LookupTable(this, table, len));
        }
Esempio n. 11
0
            public virtual ECPoint Lookup(int index)
            {
                ulong[] x   = Nat320.Create64(), y = Nat320.Create64();
                int     pos = 0;

                for (int i = 0; i < m_size; ++i)
                {
                    ulong MASK = (ulong)(long)(((i ^ index) - 1) >> 31);

                    for (int j = 0; j < SECT283R1_FE_LONGS; ++j)
                    {
                        x[j] ^= m_table[pos + j] & MASK;
                        y[j] ^= m_table[pos + SECT283R1_FE_LONGS + j] & MASK;
                    }

                    pos += (SECT283R1_FE_LONGS * 2);
                }

                return(m_outer.CreateRawPoint(new SecT283FieldElement(x), new SecT283FieldElement(y), false));
            }
Esempio n. 12
0
            public override ECPoint Lookup(int index)
            {
                ulong[] x   = Nat320.Create64(), y = Nat320.Create64();
                int     pos = 0;

                for (int i = 0; i < m_size; ++i)
                {
                    ulong MASK = (ulong)(long)(((i ^ index) - 1) >> 31);

                    for (int j = 0; j < SECT283R1_FE_LONGS; ++j)
                    {
                        x[j] ^= m_table[pos + j] & MASK;
                        y[j] ^= m_table[pos + SECT283R1_FE_LONGS + j] & MASK;
                    }

                    pos += (SECT283R1_FE_LONGS * 2);
                }

                return(CreatePoint(x, y));
            }
Esempio n. 13
0
        public static void Sqrt(ulong[] x, ulong[] z)
        {
            ulong[] array = Nat320.Create64();
            ulong   num   = Interleave.Unshuffle(x[0]);
            ulong   num2  = Interleave.Unshuffle(x[1]);
            ulong   num3  = (num & 0xFFFFFFFFu) | (num2 << 32);

            array[0] = (num >> 32) | (num2 & 0xFFFFFFFF00000000uL);
            num      = Interleave.Unshuffle(x[2]);
            num2     = Interleave.Unshuffle(x[3]);
            ulong num4 = (num & 0xFFFFFFFFu) | (num2 << 32);

            array[1] = (num >> 32) | (num2 & 0xFFFFFFFF00000000uL);
            num      = Interleave.Unshuffle(x[4]);
            ulong num5 = num & 0xFFFFFFFFu;

            array[2] = num >> 32;
            Multiply(array, ROOT_Z, z);
            ulong[] array2;
            (array2 = z)[0] = array2[0] ^ num3;
            (array2 = z)[1] = array2[1] ^ num4;
            (array2 = z)[2] = array2[2] ^ num5;
        }
Esempio n. 14
0
        public static void Invert(ulong[] x, ulong[] z)
        {
            if (Nat320.IsZero64(x))
            {
                throw new InvalidOperationException();
            }

            // Itoh-Tsujii inversion

            ulong[] t0 = Nat320.Create64();
            ulong[] t1 = Nat320.Create64();

            Square(x, t0);
            Multiply(t0, x, t0);
            SquareN(t0, 2, t1);
            Multiply(t1, t0, t1);
            SquareN(t1, 4, t0);
            Multiply(t0, t1, t0);
            SquareN(t0, 8, t1);
            Multiply(t1, t0, t1);
            Square(t1, t1);
            Multiply(t1, x, t1);
            SquareN(t1, 17, t0);
            Multiply(t0, t1, t0);
            Square(t0, t0);
            Multiply(t0, x, t0);
            SquareN(t0, 35, t1);
            Multiply(t1, t0, t1);
            SquareN(t1, 70, t0);
            Multiply(t0, t1, t0);
            Square(t0, t0);
            Multiply(t0, x, t0);
            SquareN(t0, 141, t1);
            Multiply(t1, t0, t1);
            Square(t1, z);
        }
Esempio n. 15
0
 public override BigInteger ToBigInteger()
 {
     return(Nat320.ToBigInteger64(x));
 }
 public override BigInteger ToBigInteger() =>
 Nat320.ToBigInteger64(this.x);
Esempio n. 17
0
 public static ulong[] FromBigInteger(BigInteger x)
 {
     ulong[] z = Nat320.FromBigInteger64(x);
     Reduce37(z, 0);
     return(z);
 }
Esempio n. 18
0
 public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz)
 {
     ulong[] array = Nat320.CreateExt64();
     SecT283Field.ImplMultiply(x, y, array);
     SecT283Field.AddExt(zz, array, zz);
 }
Esempio n. 19
0
 public override ECFieldElement Add(ECFieldElement b)
 {
     ulong[] z = Nat320.Create64();
     SecT283Field.Add(this.x, ((SecT283FieldElement)b).x, z);
     return(new SecT283FieldElement(z));
 }
Esempio n. 20
0
 public static ulong[] FromBigInteger(BigInteger x)
 {
     ulong[] array = Nat320.FromBigInteger64(x);
     SecT283Field.Reduce37(array, 0);
     return(array);
 }
Esempio n. 21
0
 public static void Multiply(ulong[] x, ulong[] y, ulong[] z)
 {
     ulong[] array = Nat320.CreateExt64();
     SecT283Field.ImplMultiply(x, y, array);
     SecT283Field.Reduce(array, z);
 }
Esempio n. 22
0
 public override ECFieldElement Square()
 {
     ulong[] z = Nat320.Create64();
     SecT283Field.Square(this.x, z);
     return(new SecT283FieldElement(z));
 }
Esempio n. 23
0
 public virtual bool Equals(SecT283FieldElement other)
 {
     return(this == other || (other != null && Nat320.Eq64(this.x, other.x)));
 }
Esempio n. 24
0
 public SecT283FieldElement()
 {
     this.x = Nat320.Create64();
 }
Esempio n. 25
0
 public override ECFieldElement Multiply(ECFieldElement b)
 {
     ulong[] z = Nat320.Create64();
     SecT283Field.Multiply(x, ((SecT283FieldElement)b).x, z);
     return(new SecT283FieldElement(z));
 }
Esempio n. 26
0
 public static void Multiply(ulong[] x, ulong[] y, ulong[] z)
 {
     ulong[] tt = Nat320.CreateExt64();
     ImplMultiply(x, y, tt);
     Reduce(tt, z);
 }
Esempio n. 27
0
 public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz)
 {
     ulong[] tt = Nat320.CreateExt64();
     ImplMultiply(x, y, tt);
     AddExt(zz, tt, zz);
 }
Esempio n. 28
0
 public override ECFieldElement AddOne()
 {
     ulong[] z = Nat320.Create64();
     SecT283Field.AddOne(x, z);
     return(new SecT283FieldElement(z));
 }