package org.bouncycastle.math.raw;
private static final long M = 0xFFFFFFFFL;
public static int add(int[] x, int[] y, int[] z)
c += (x[0] & M) + (y[0] & M);
c += (x[1] & M) + (y[1] & M);
c += (x[2] & M) + (y[2] & M);
c += (x[3] & M) + (y[3] & M);
c += (x[4] & M) + (y[4] & M);
c += (x[5] & M) + (y[5] & M);
public static int addBothTo(int[] x, int[] y, int[] z)
c += (x[0] & M) + (y[0] & M) + (z[0] & M);
c += (x[1] & M) + (y[1] & M) + (z[1] & M);
c += (x[2] & M) + (y[2] & M) + (z[2] & M);
c += (x[3] & M) + (y[3] & M) + (z[3] & M);
c += (x[4] & M) + (y[4] & M) + (z[4] & M);
c += (x[5] & M) + (y[5] & M) + (z[5] & M);
public static int addTo(int[] x, int[] z)
c += (x[0] & M) + (z[0] & M);
c += (x[1] & M) + (z[1] & M);
c += (x[2] & M) + (z[2] & M);
c += (x[3] & M) + (z[3] & M);
c += (x[4] & M) + (z[4] & M);
c += (x[5] & M) + (z[5] & M);
public static int addTo(int[] x, int xOff, int[] z, int zOff, int cIn)
c += (x[xOff + 0] & M) + (z[zOff + 0] & M);
c += (x[xOff + 1] & M) + (z[zOff + 1] & M);
c += (x[xOff + 2] & M) + (z[zOff + 2] & M);
c += (x[xOff + 3] & M) + (z[zOff + 3] & M);
c += (x[xOff + 4] & M) + (z[zOff + 4] & M);
c += (x[xOff + 5] & M) + (z[zOff + 5] & M);
public static int addToEachOther(int[] u, int uOff, int[] v, int vOff)
c += (u[uOff + 0] & M) + (v[vOff + 0] & M);
c += (u[uOff + 1] & M) + (v[vOff + 1] & M);
c += (u[uOff + 2] & M) + (v[vOff + 2] & M);
c += (u[uOff + 3] & M) + (v[vOff + 3] & M);
c += (u[uOff + 4] & M) + (v[vOff + 4] & M);
c += (u[uOff + 5] & M) + (v[vOff + 5] & M);
public static void copy(int[] x, int[] z)
public static boolean diff(int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
boolean pos = gte(x, xOff, y, yOff);
sub(x, xOff, y, yOff, z, zOff);
sub(y, yOff, x, xOff, z, zOff);
public static boolean eq(int[] x, int[] y)
for (int i = 5; i >= 0; --i)
public static int getBit(int[] x, int bit)
public static boolean gte(int[] x, int[] y)
for (int i = 5; i >= 0; --i)
public static boolean gte(int[] x, int xOff, int[] y, int yOff)
for (int i = 5; i >= 0; --i)
public static boolean isOne(int[] x)
for (int i = 1; i < 6; ++i)
public static boolean isZero(int[] x)
for (int i = 0; i < 6; ++i)
public static void mul(int[] x, int[] y, int[] zz)
long c = 0, x_0 = x[0] & M;
for (int i = 1; i < 6; ++i)
long c = 0, x_i = x[i] & M;
c += x_i * y_0 + (zz[i + 0] & M);
c += x_i * y_1 + (zz[i + 1] & M);
c += x_i * y_2 + (zz[i + 2] & M);
c += x_i * y_3 + (zz[i + 3] & M);
c += x_i * y_4 + (zz[i + 4] & M);
c += x_i * y_5 + (zz[i + 5] & M);
public static void mul(int[] x, int xOff, int[] y, int yOff, int[] zz, int zzOff)
long y_0 = y[yOff + 0] & M;
long y_1 = y[yOff + 1] & M;
long y_2 = y[yOff + 2] & M;
long y_3 = y[yOff + 3] & M;
long y_4 = y[yOff + 4] & M;
long y_5 = y[yOff + 5] & M;
long c = 0, x_0 = x[xOff + 0] & M;
for (int i = 1; i < 6; ++i)
long c = 0, x_i = x[xOff + i] & M;
c += x_i * y_0 + (zz[zzOff + 0] & M);
c += x_i * y_1 + (zz[zzOff + 1] & M);
c += x_i * y_2 + (zz[zzOff + 2] & M);
c += x_i * y_3 + (zz[zzOff + 3] & M);
c += x_i * y_4 + (zz[zzOff + 4] & M);
c += x_i * y_5 + (zz[zzOff + 5] & M);
public static int mulAddTo(int[] x, int[] y, int[] zz)
for (int i = 0; i < 6; ++i)
long c = 0, x_i = x[i] & M;
c += x_i * y_0 + (zz[i + 0] & M);
c += x_i * y_1 + (zz[i + 1] & M);
c += x_i * y_2 + (zz[i + 2] & M);
c += x_i * y_3 + (zz[i + 3] & M);
c += x_i * y_4 + (zz[i + 4] & M);
c += x_i * y_5 + (zz[i + 5] & M);
c += zc + (zz[i + 6] & M);
public static int mulAddTo(int[] x, int xOff, int[] y, int yOff, int[] zz, int zzOff)
long y_0 = y[yOff + 0] & M;
long y_1 = y[yOff + 1] & M;
long y_2 = y[yOff + 2] & M;
long y_3 = y[yOff + 3] & M;
long y_4 = y[yOff + 4] & M;
long y_5 = y[yOff + 5] & M;
for (int i = 0; i < 6; ++i)
long c = 0, x_i = x[xOff + i] & M;
c += x_i * y_0 + (zz[zzOff + 0] & M);
c += x_i * y_1 + (zz[zzOff + 1] & M);
c += x_i * y_2 + (zz[zzOff + 2] & M);
c += x_i * y_3 + (zz[zzOff + 3] & M);
c += x_i * y_4 + (zz[zzOff + 4] & M);
c += x_i * y_5 + (zz[zzOff + 5] & M);
c += zc + (zz[zzOff + 6] & M);
public static long mul33Add(int w, int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
long c = 0, wVal = w & M;
long x0 = x[xOff + 0] & M;
c += wVal * x0 + (y[yOff + 0] & M);
long x1 = x[xOff + 1] & M;
c += wVal * x1 + x0 + (y[yOff + 1] & M);
long x2 = x[xOff + 2] & M;
c += wVal * x2 + x1 + (y[yOff + 2] & M);
long x3 = x[xOff + 3] & M;
c += wVal * x3 + x2 + (y[yOff + 3] & M);
long x4 = x[xOff + 4] & M;
c += wVal * x4 + x3 + (y[yOff + 4] & M);
long x5 = x[xOff + 5] & M;
c += wVal * x5 + x4 + (y[yOff + 5] & M);
public static int mulWordAddExt(int x, int[] yy, int yyOff, int[] zz, int zzOff)
long c = 0, xVal = x & M;
c += xVal * (yy[yyOff + 0] & M) + (zz[zzOff + 0] & M);
c += xVal * (yy[yyOff + 1] & M) + (zz[zzOff + 1] & M);
c += xVal * (yy[yyOff + 2] & M) + (zz[zzOff + 2] & M);
c += xVal * (yy[yyOff + 3] & M) + (zz[zzOff + 3] & M);
c += xVal * (yy[yyOff + 4] & M) + (zz[zzOff + 4] & M);
c += xVal * (yy[yyOff + 5] & M) + (zz[zzOff + 5] & M);
public static int mul33DWordAdd(int x, long y, int[] z, int zOff)
long c = 0, xVal = x & M;
c += xVal * y00 + (z[zOff + 0] & M);
c += xVal * y01 + y00 + (z[zOff + 1] & M);
c += y01 + (z[zOff + 2] & M);
return c == 0 ? 0 : Nat.incAt(6, z, zOff, 4);
public static int mul33WordAdd(int x, int y, int[] z, int zOff)
long c = 0, xVal = x & M, yVal = y & M;
c += yVal * xVal + (z[zOff + 0] & M);
c += yVal + (z[zOff + 1] & M);
return c == 0 ? 0 : Nat.incAt(6, z, zOff, 3);
long c = 0, xVal = x & M;
c += xVal * (y & M) + (z[zOff + 0] & M);
c += xVal * (y >>> 32) + (z[zOff + 1] & M);
return c == 0 ? 0 : Nat.incAt(6, z, zOff, 3);
public static int mulWord(int x, int[] y, int[] z, int zOff)
long c = 0, xVal = x & M;
public static void square(int[] x, int[] zz)
long xVal = (x[i--] & M);
zz[--j] = (c << 31) | (int)(p >>> 33);
zz[--j] = (int)(p >>> 1);
zz_1 = ((c << 31) & M) | (p >>> 33);
zz_3 += (zz_2 >>> 32) + x_2 * x_1;
zz_4 += (zz_3 >>> 32) + x_3 * x_1;
zz_5 += (zz_4 >>> 32) + x_3 * x_2;
zz_5 += (zz_4 >>> 32) + x_4 * x_1;
zz_6 += (zz_5 >>> 32) + x_4 * x_2;
zz_7 += (zz_6 >>> 32) + x_4 * x_3;
zz_6 += (zz_5 >>> 32) + x_5 * x_1;
zz_7 += (zz_6 >>> 32) + x_5 * x_2;
zz_8 += (zz_7 >>> 32) + x_5 * x_3;
zz_9 += (zz_8 >>> 32) + x_5 * x_4;
w = zz[11] + (int)(zz_10 >> 32);
public static void square(int[] x, int xOff, int[] zz, int zzOff)
long x_0 = x[xOff + 0] & M;
long xVal = (x[xOff + i--] & M);
zz[zzOff + --j] = (c << 31) | (int)(p >>> 33);
zz[zzOff + --j] = (int)(p >>> 1);
zz_1 = ((c << 31) & M) | (p >>> 33);
long x_1 = x[xOff + 1] & M;
long zz_2 = zz[zzOff + 2] & M;
zz[zzOff + 1] = (w << 1) | c;
long x_2 = x[xOff + 2] & M;
long zz_3 = zz[zzOff + 3] & M;
long zz_4 = zz[zzOff + 4] & M;
zz[zzOff + 2] = (w << 1) | c;
zz_3 += (zz_2 >>> 32) + x_2 * x_1;
long x_3 = x[xOff + 3] & M;
long zz_5 = zz[zzOff + 5] & M;
long zz_6 = zz[zzOff + 6] & M;
zz[zzOff + 3] = (w << 1) | c;
zz_4 += (zz_3 >>> 32) + x_3 * x_1;
zz_5 += (zz_4 >>> 32) + x_3 * x_2;
long x_4 = x[xOff + 4] & M;
long zz_7 = zz[zzOff + 7] & M;
long zz_8 = zz[zzOff + 8] & M;
zz[zzOff + 4] = (w << 1) | c;
zz_5 += (zz_4 >>> 32) + x_4 * x_1;
zz_6 += (zz_5 >>> 32) + x_4 * x_2;
zz_7 += (zz_6 >>> 32) + x_4 * x_3;
long x_5 = x[xOff + 5] & M;
long zz_9 = zz[zzOff + 9] & M;
long zz_10 = zz[zzOff + 10] & M;
zz[zzOff + 5] = (w << 1) | c;
zz_6 += (zz_5 >>> 32) + x_5 * x_1;
zz_7 += (zz_6 >>> 32) + x_5 * x_2;
zz_8 += (zz_7 >>> 32) + x_5 * x_3;
zz_9 += (zz_8 >>> 32) + x_5 * x_4;
zz[zzOff + 6] = (w << 1) | c;
zz[zzOff + 7] = (w << 1) | c;
zz[zzOff + 8] = (w << 1) | c;
zz[zzOff + 9] = (w << 1) | c;
zz[zzOff + 10] = (w << 1) | c;
w = zz[zzOff + 11] + (int)(zz_10 >> 32);
zz[zzOff + 11] = (w << 1) | c;
public static int sub(int[] x, int[] y, int[] z)
c += (x[0] & M) - (y[0] & M);
c += (x[1] & M) - (y[1] & M);
c += (x[2] & M) - (y[2] & M);
c += (x[3] & M) - (y[3] & M);
c += (x[4] & M) - (y[4] & M);
c += (x[5] & M) - (y[5] & M);
public static int sub(int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
c += (x[xOff + 0] & M) - (y[yOff + 0] & M);
c += (x[xOff + 1] & M) - (y[yOff + 1] & M);
c += (x[xOff + 2] & M) - (y[yOff + 2] & M);
c += (x[xOff + 3] & M) - (y[yOff + 3] & M);
c += (x[xOff + 4] & M) - (y[yOff + 4] & M);
c += (x[xOff + 5] & M) - (y[yOff + 5] & M);
public static int subBothFrom(int[] x, int[] y, int[] z)
c += (z[0] & M) - (x[0] & M) - (y[0] & M);
c += (z[1] & M) - (x[1] & M) - (y[1] & M);
c += (z[2] & M) - (x[2] & M) - (y[2] & M);
c += (z[3] & M) - (x[3] & M) - (y[3] & M);
c += (z[4] & M) - (x[4] & M) - (y[4] & M);
c += (z[5] & M) - (x[5] & M) - (y[5] & M);
public static int subFrom(int[] x, int[] z)
c += (z[0] & M) - (x[0] & M);
c += (z[1] & M) - (x[1] & M);
c += (z[2] & M) - (x[2] & M);
c += (z[3] & M) - (x[3] & M);
c += (z[4] & M) - (x[4] & M);
c += (z[5] & M) - (x[5] & M);
public static int subFrom(int[] x, int xOff, int[] z, int zOff)
c += (z[zOff + 0] & M) - (x[xOff + 0] & M);
c += (z[zOff + 1] & M) - (x[xOff + 1] & M);
c += (z[zOff + 2] & M) - (x[xOff + 2] & M);
c += (z[zOff + 3] & M) - (x[xOff + 3] & M);
c += (z[zOff + 4] & M) - (x[xOff + 4] & M);
c += (z[zOff + 5] & M) - (x[xOff + 5] & M);
byte[] bs = new byte[24];
for (int i = 0; i < 6; ++i)
public static void zero(int[] z)