public static void mul(int[] x, int[] y, int[] zz) { Nat192.mul(x, y, zz); Nat192.mul(x, 6, y, 6, zz, 12); int c18 = Nat192.addToEachOther(zz, 6, zz, 12); int c12 = c18 + Nat192.addTo(zz, 0, zz, 6, 0); c18 += Nat192.addTo(zz, 18, zz, 12, c12); int[] dx = Nat192.create(), dy = Nat192.create(); boolean neg = Nat192.diff(x, 6, x, 0, dx, 0) != Nat192.diff(y, 6, y, 0, dy, 0); int[] tt = Nat192.createExt(); Nat192.mul(dx, dy, tt); c18 += neg ? Nat.addTo(12, tt, 0, zz, 6) : Nat.subFrom(12, tt, 0, zz, 6); Nat.addWordAt(24, c18, zz, 18); }
public boolean equals(Object other) { if (other == this) { return true; } if (!(other instanceof SecP192R1FieldElement)) { return false; } SecP192R1FieldElement o = (SecP192R1FieldElement)other; return Nat192.eq(x, o.x); }
public static int[] fromBigInteger(BigInteger x) { int[] z = Nat192.fromBigInteger(x); if (z[5] == P5 && Nat192.gte(z, P)) { Nat192.subFrom(P, z); } return z; }
public static void square(int[] x, int[] zz) { Nat192.square(x, zz); Nat192.square(x, 6, zz, 12); int c18 = Nat192.addToEachOther(zz, 6, zz, 12); int c12 = c18 + Nat192.addTo(zz, 0, zz, 6, 0); c18 += Nat192.addTo(zz, 18, zz, 12, c12); int[] dx = Nat192.create(); Nat192.diff(x, 6, x, 0, dx, 0); int[] tt = Nat192.createExt(); Nat192.square(dx, tt); c18 += Nat.subFrom(12, tt, 0, zz, 6); Nat.addWordAt(24, c18, zz, 18); } }
int[] tt1 = Nat192.createExt(); int[] t2 = Nat192.create(); int[] t3 = Nat192.create(); int[] t4 = Nat192.create(); int[] H = Nat192.create(); SecP192K1Field.subtract(U1, U2, H); if (Nat192.isZero(H)) if (Nat192.isZero(R)) SecP192K1Field.square(H, HSquared); int[] G = Nat192.create(); SecP192K1Field.multiply(HSquared, H, G); Nat192.mul(S1, G, tt1); c = Nat192.addBothTo(V, V, G); SecP192K1Field.reduce32(c, G);
public SecP192K1FieldElement() { this.x = Nat192.create(); }
int[] Y1Squared = Nat192.create(); SecP192K1Field.square(Y1.x, Y1Squared); int[] T = Nat192.create(); SecP192K1Field.square(Y1Squared, T); int[] M = Nat192.create(); SecP192K1Field.square(X1.x, M); c = Nat192.addBothTo(M, M, M); SecP192K1Field.reduce32(c, M); SecP192K1Field.reduce32(c, S); int[] t1 = Nat192.create(); c = Nat.shiftUpBits(6, T, 3, 0, t1); SecP192K1Field.reduce32(c, t1);
public static void half(int[] x, int[] z) { if ((x[0] & 1) == 0) { Nat.shiftDownBit(6, x, 0, z); } else { int c = Nat192.add(x, P, z); Nat.shiftDownBit(6, z, c); } }
public boolean testBitZero() { return Nat192.getBit(x, 0) == 1; }
int[] tt1 = Nat192.createExt(); int[] t2 = Nat192.create(); int[] t3 = Nat192.create(); int[] t4 = Nat192.create(); int[] H = Nat192.create(); SecP192K1Field.subtract(U1, U2, H); if (Nat192.isZero(H)) if (Nat192.isZero(R)) SecP192K1Field.square(H, HSquared); int[] G = Nat192.create(); SecP192K1Field.multiply(HSquared, H, G); Nat192.mul(S1, G, tt1); c = Nat192.addBothTo(V, V, G); SecP192K1Field.reduce32(c, G);
public static void square(int[] x, int[] zz) { Nat192.square(x, zz); Nat192.square(x, 6, zz, 12); int c18 = Nat192.addToEachOther(zz, 6, zz, 12); int c12 = c18 + Nat192.addTo(zz, 0, zz, 6, 0); c18 += Nat192.addTo(zz, 18, zz, 12, c12); int[] dx = Nat192.create(); Nat192.diff(x, 6, x, 0, dx, 0); int[] tt = Nat192.createExt(); Nat192.square(dx, tt); c18 += Nat.subFrom(12, tt, 0, zz, 6); Nat.addWordAt(24, c18, zz, 18); } }
public SecP192R1FieldElement() { this.x = Nat192.create(); }
public static int[] fromBigInteger(BigInteger x) { int[] z = Nat192.fromBigInteger(x); if (z[5] == P5 && Nat192.gte(z, P)) { Nat192.subFrom(P, z); } return z; }