All Downloads are FREE. Search and download functionalities are using the official Maven repository.

java-ec.com.unbound.common.crypto.ec.math.UInt256 Maven / Gradle / Ivy

Go to download

This is a collection of JAVA libraries that implement Unbound cryptographic classes for JAVA provider, PKCS11 wrapper, cryptoki, and advapi

There is a newer version: 42761
Show newest version
package com.unbound.common.crypto.ec.math;

public abstract class UInt256
{
  public static final int[] ONE = {1, 0, 0, 0, 0, 0, 0, 0};

  private static final long LM = 0xffffffffL;

  private static long U64(int x) { return x & LM; }
  private static long LO(long x) { return x & LM; }
  private static long HI(long x) { return x >>> 32; }

  public static void copy(int[] r, int[] x)
  {
    r[0] = x[0]; r[1] = x[1]; r[2] = x[2]; r[3] = x[3]; r[4] = x[4]; r[5] = x[5]; r[6] = x[6]; r[7] = x[7];
  }

  public static void cmov(int[] r, int cond, int[] x) { cmov(r, cond, r, x); } // r = cond ? x : r

  public static void cmov(int[] r, int cond, int[] x, int[] y) // r = cond ? y : x
  {
    cond = -(cond & 1);
    r[0] = ((x[0] ^ y[0]) & cond) ^ x[0];
    r[1] = ((x[1] ^ y[1]) & cond) ^ x[1];
    r[2] = ((x[2] ^ y[2]) & cond) ^ x[2];
    r[3] = ((x[3] ^ y[3]) & cond) ^ x[3];
    r[4] = ((x[4] ^ y[4]) & cond) ^ x[4];
    r[5] = ((x[5] ^ y[5]) & cond) ^ x[5];
    r[6] = ((x[6] ^ y[6]) & cond) ^ x[6];
    r[7] = ((x[7] ^ y[7]) & cond) ^ x[7];
  }

  public static void shr(int[] r, int[] x, int shift)
  {
    r[0] = (x[0] >>> shift) | (x[1]<<(32-shift));
    r[1] = (x[1] >>> shift) | (x[2]<<(32-shift));
    r[2] = (x[2] >>> shift) | (x[3]<<(32-shift));
    r[3] = (x[3] >>> shift) | (x[4]<<(32-shift));
    r[4] = (x[4] >>> shift) | (x[5]<<(32-shift));
    r[5] = (x[5] >>> shift) | (x[6]<<(32-shift));
    r[6] = (x[6] >>> shift) | (x[7]<<(32-shift));
    r[7] =  x[7] >>> shift;
  }

  public static int add(int[] r, int[] x, int[] y, int carry)
  {
    long c = carry;
    c += (x[0] & 0xffffffffL) + (y[0] & 0xffffffffL); r[0] = (int)c; c >>>= 32;
    c += (x[1] & 0xffffffffL) + (y[1] & 0xffffffffL); r[1] = (int)c; c >>>= 32;
    c += (x[2] & 0xffffffffL) + (y[2] & 0xffffffffL); r[2] = (int)c; c >>>= 32;
    c += (x[3] & 0xffffffffL) + (y[3] & 0xffffffffL); r[3] = (int)c; c >>>= 32;
    c += (x[4] & 0xffffffffL) + (y[4] & 0xffffffffL); r[4] = (int)c; c >>>= 32;
    c += (x[5] & 0xffffffffL) + (y[5] & 0xffffffffL); r[5] = (int)c; c >>>= 32;
    c += (x[6] & 0xffffffffL) + (y[6] & 0xffffffffL); r[6] = (int)c; c >>>= 32;
    c += (x[7] & 0xffffffffL) + (y[7] & 0xffffffffL); r[7] = (int)c; c >>>= 32;
    return (int)c;
  }

  public static int add(int[] r, int[] x, int[] y)
  {
    return add(r, x, y, 0);
  }

  public static int add(int[] r, int[] x, int y)
  {
    long c = 0;
    c += (x[0] & 0xffffffffL) + (y& 0xffffffffL); r[0] = (int)c; c >>>= 32;
    c += (x[1] & 0xffffffffL);                    r[1] = (int)c; c >>>= 32;
    c += (x[2] & 0xffffffffL);                    r[2] = (int)c; c >>>= 32;
    c += (x[3] & 0xffffffffL);                    r[3] = (int)c; c >>>= 32;
    c += (x[4] & 0xffffffffL);                    r[4] = (int)c; c >>>= 32;
    c += (x[5] & 0xffffffffL);                    r[5] = (int)c; c >>>= 32;
    c += (x[6] & 0xffffffffL);                    r[6] = (int)c; c >>>= 32;
    c += (x[7] & 0xffffffffL);                    r[7] = (int)c; c >>>= 32;
    return (int)c;
  }

  public static int sub(int[] r, int[] x)
  {
    return sub(r, r, x);
  }

  public static int sub(int[] r, int[] x, int[] y)
  {
    long c = 0;
    c += (x[0] & 0xffffffffL) - (y[0] & 0xffffffffL); r[0] = (int)c; c >>= 32;
    c += (x[1] & 0xffffffffL) - (y[1] & 0xffffffffL); r[1] = (int)c; c >>= 32;
    c += (x[2] & 0xffffffffL) - (y[2] & 0xffffffffL); r[2] = (int)c; c >>= 32;
    c += (x[3] & 0xffffffffL) - (y[3] & 0xffffffffL); r[3] = (int)c; c >>= 32;
    c += (x[4] & 0xffffffffL) - (y[4] & 0xffffffffL); r[4] = (int)c; c >>= 32;
    c += (x[5] & 0xffffffffL) - (y[5] & 0xffffffffL); r[5] = (int)c; c >>= 32;
    c += (x[6] & 0xffffffffL) - (y[6] & 0xffffffffL); r[6] = (int)c; c >>= 32;
    c += (x[7] & 0xffffffffL) - (y[7] & 0xffffffffL); r[7] = (int)c; c >>= 32;
    return (int)c & 1;
  }

  public static boolean equ(int[] x, int[] y)
  {
    int c = 0;
    c |= (x[0] ^ y[0]);
    c |= (x[1] ^ y[1]);
    c |= (x[2] ^ y[2]);
    c |= (x[3] ^ y[3]);
    c |= (x[4] ^ y[4]);
    c |= (x[5] ^ y[5]);
    c |= (x[6] ^ y[6]);
    c |= (x[7] ^ y[7]);
    return c==0;
  }

  public static void setZero(int[] x)
  {
    setInt(x, 0);
  }

  public static void setInt(int[] x, int y)
  {
    x[0] = y; x[1] = 0; x[2] = 0; x[3] = 0; x[4] = 0; x[5] = 0; x[6] = 0; x[7] = 0;
  }

  public static int isZero(int[] x)
  {
    return isInt(x, 0);
  }

  public static int isInt(int[] x, int y)
  {
    int r = 0;
    r |= x[0] ^ y; r |= x[1]; r |= x[2]; r |= x[3]; r |= x[4]; r |= x[5]; r |= x[6]; r |= x[7];
    return (r==0) ? -1 : 0;
  }

  //public static void mul(int[] r, int[] x, int[] y) { Comba.mul8(r, x, y); }
  //public static void sqr(int[] r, int[] x) { Comba.sqr8(r, x); }

  public static int[] alloc() { return new int[8]; }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy