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; }
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)); }
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)); }
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); } }
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)); }
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)); }
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)); }
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; }
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); }
public override BigInteger ToBigInteger() { return(Nat320.ToBigInteger64(x)); }
public override BigInteger ToBigInteger() => Nat320.ToBigInteger64(this.x);
public static ulong[] FromBigInteger(BigInteger x) { ulong[] z = Nat320.FromBigInteger64(x); Reduce37(z, 0); return(z); }
public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz) { ulong[] array = Nat320.CreateExt64(); SecT283Field.ImplMultiply(x, y, array); SecT283Field.AddExt(zz, array, zz); }
public override ECFieldElement Add(ECFieldElement b) { ulong[] z = Nat320.Create64(); SecT283Field.Add(this.x, ((SecT283FieldElement)b).x, z); return(new SecT283FieldElement(z)); }
public static ulong[] FromBigInteger(BigInteger x) { ulong[] array = Nat320.FromBigInteger64(x); SecT283Field.Reduce37(array, 0); return(array); }
public static void Multiply(ulong[] x, ulong[] y, ulong[] z) { ulong[] array = Nat320.CreateExt64(); SecT283Field.ImplMultiply(x, y, array); SecT283Field.Reduce(array, z); }
public override ECFieldElement Square() { ulong[] z = Nat320.Create64(); SecT283Field.Square(this.x, z); return(new SecT283FieldElement(z)); }
public virtual bool Equals(SecT283FieldElement other) { return(this == other || (other != null && Nat320.Eq64(this.x, other.x))); }
public SecT283FieldElement() { this.x = Nat320.Create64(); }
public override ECFieldElement Multiply(ECFieldElement b) { ulong[] z = Nat320.Create64(); SecT283Field.Multiply(x, ((SecT283FieldElement)b).x, z); return(new SecT283FieldElement(z)); }
public static void Multiply(ulong[] x, ulong[] y, ulong[] z) { ulong[] tt = Nat320.CreateExt64(); ImplMultiply(x, y, tt); Reduce(tt, z); }
public static void MultiplyAddToExt(ulong[] x, ulong[] y, ulong[] zz) { ulong[] tt = Nat320.CreateExt64(); ImplMultiply(x, y, tt); AddExt(zz, tt, zz); }
public override ECFieldElement AddOne() { ulong[] z = Nat320.Create64(); SecT283Field.AddOne(x, z); return(new SecT283FieldElement(z)); }