package org.bouncycastle.pqc.math.linearalgebra;

import java.math.BigInteger;

FIXME: is this really necessary?!
/** * FIXME: is this really necessary?! */
public final class BigIntUtils {
Default constructor (private).
/** * Default constructor (private). */
private BigIntUtils() { // empty }
Checks if two BigInteger arrays contain the same entries
Params:
  • a – first BigInteger array
  • b – second BigInteger array
Returns:true or false
/** * Checks if two BigInteger arrays contain the same entries * * @param a first BigInteger array * @param b second BigInteger array * @return true or false */
public static boolean equals(BigInteger[] a, BigInteger[] b) { int flag = 0; if (a.length != b.length) { return false; } for (int i = 0; i < a.length; i++) { // avoid branches here! // problem: compareTo on BigIntegers is not // guaranteed constant-time! flag |= a[i].compareTo(b[i]); } return flag == 0; }
Fill the given BigInteger array with the given value.
Params:
  • array – the array
  • value – the value
/** * Fill the given BigInteger array with the given value. * * @param array the array * @param value the value */
public static void fill(BigInteger[] array, BigInteger value) { for (int i = array.length - 1; i >= 0; i--) { array[i] = value; } }
Generates a subarray of a given BigInteger array.
Params:
  • input – - the input BigInteger array
  • start – - the start index
  • end – - the end index
Returns:a subarray of input, ranging from start to end
/** * Generates a subarray of a given BigInteger array. * * @param input - * the input BigInteger array * @param start - * the start index * @param end - * the end index * @return a subarray of <tt>input</tt>, ranging from <tt>start</tt> to * <tt>end</tt> */
public static BigInteger[] subArray(BigInteger[] input, int start, int end) { BigInteger[] result = new BigInteger[end - start]; System.arraycopy(input, start, result, 0, end - start); return result; }
Converts a BigInteger array into an integer array
Params:
  • input – - the BigInteger array
Returns:the integer array
/** * Converts a BigInteger array into an integer array * * @param input - * the BigInteger array * @return the integer array */
public static int[] toIntArray(BigInteger[] input) { int[] result = new int[input.length]; for (int i = 0; i < input.length; i++) { result[i] = input[i].intValue(); } return result; }
Converts a BigInteger array into an integer array, reducing all BigIntegers mod q.
Params:
  • q – - the modulus
  • input – - the BigInteger array
Returns:the integer array
/** * Converts a BigInteger array into an integer array, reducing all * BigIntegers mod q. * * @param q - * the modulus * @param input - * the BigInteger array * @return the integer array */
public static int[] toIntArrayModQ(int q, BigInteger[] input) { BigInteger bq = BigInteger.valueOf(q); int[] result = new int[input.length]; for (int i = 0; i < input.length; i++) { result[i] = input[i].mod(bq).intValue(); } return result; }
Return the value of big as a byte array. Although BigInteger has such a method, it uses an extra bit to indicate the sign of the number. For elliptic curve cryptography, the numbers usually are positive. Thus, this helper method returns a byte array of minimal length, ignoring the sign of the number.
Params:
  • value – the BigInteger value to be converted to a byte array
Returns:the value big as byte array
/** * Return the value of <tt>big</tt> as a byte array. Although BigInteger * has such a method, it uses an extra bit to indicate the sign of the * number. For elliptic curve cryptography, the numbers usually are * positive. Thus, this helper method returns a byte array of minimal * length, ignoring the sign of the number. * * @param value the <tt>BigInteger</tt> value to be converted to a byte * array * @return the value <tt>big</tt> as byte array */
public static byte[] toMinimalByteArray(BigInteger value) { byte[] valBytes = value.toByteArray(); if ((valBytes.length == 1) || (value.bitLength() & 0x07) != 0) { return valBytes; } byte[] result = new byte[value.bitLength() >> 3]; System.arraycopy(valBytes, 1, result, 0, result.length); return result; } }