public static void AddOne(uint[] x, uint[] z) { Nat.Copy(12, x, z); uint c = Nat.Inc(12, z, 0); if (c != 0 || (z[11] == P11 && Nat.Gte(12, z, P))) { Nat.Sub(12, z, P, z); } }
public static void AddOne(uint[] x, uint[] z) { Nat.Copy(16, x, z); uint c = Nat.Inc(16, z, 0) + x[16]; if (c > P16 || (c == P16 && Nat.Eq(16, z, P))) { c += Nat.Inc(16, z, 0); c &= P16; } z[16] = c; }
public override ECLookupTable CreateCacheSafeLookupTable(ECPoint[] points, int off, int len) { uint[] table = new uint[len * SECP521R1_FE_INTS * 2]; { int pos = 0; for (int i = 0; i < len; ++i) { ECPoint p = points[off + i]; Nat.Copy(SECP521R1_FE_INTS, ((SecP521R1FieldElement)p.RawXCoord).x, 0, table, pos); pos += SECP521R1_FE_INTS; Nat.Copy(SECP521R1_FE_INTS, ((SecP521R1FieldElement)p.RawYCoord).x, 0, table, pos); pos += SECP521R1_FE_INTS; } } return(new SecP521R1LookupTable(this, table, len)); }
public static void Invert(uint[] p, uint[] x, uint[] z) { int num = p.Length; if (Nat.IsZero(num, x)) { throw new ArgumentException("cannot be 0", "x"); } if (Nat.IsOne(num, x)) { Array.Copy(x, 0, z, 0, num); return; } uint[] array = Nat.Copy(num, x); uint[] array2 = Nat.Create(num); array2[0] = 1u; int xc = 0; if ((array[0] & 1) == 0) { InversionStep(p, array, num, array2, ref xc); } if (Nat.IsOne(num, array)) { InversionResult(p, xc, array2, z); return; } uint[] array3 = Nat.Copy(num, p); uint[] array4 = Nat.Create(num); int xc2 = 0; int num2 = num; while (true) { if (array[num2 - 1] == 0 && array3[num2 - 1] == 0) { num2--; } else if (Nat.Gte(num, array, array3)) { Nat.SubFrom(num, array3, array); xc += Nat.SubFrom(num, array4, array2) - xc2; InversionStep(p, array, num2, array2, ref xc); if (Nat.IsOne(num, array)) { InversionResult(p, xc, array2, z); return; } } else { Nat.SubFrom(num, array, array3); xc2 += Nat.SubFrom(num, array2, array4) - xc; InversionStep(p, array3, num2, array4, ref xc2); if (Nat.IsOne(num, array3)) { break; } } } InversionResult(p, xc2, array4, z); }