| package org.bouncycastle.pqc.crypto.gmss.util; |
| |
| /** |
| * This class provides several methods that are required by the GMSS classes. |
| */ |
| public class GMSSUtil |
| { |
| /** |
| * Converts a 32 bit integer into a byte array beginning at |
| * <code>offset</code> (little-endian representation) |
| * |
| * @param value the integer to convert |
| */ |
| public byte[] intToBytesLittleEndian(int value) |
| { |
| byte[] bytes = new byte[4]; |
| |
| bytes[0] = (byte)((value) & 0xff); |
| bytes[1] = (byte)((value >> 8) & 0xff); |
| bytes[2] = (byte)((value >> 16) & 0xff); |
| bytes[3] = (byte)((value >> 24) & 0xff); |
| return bytes; |
| } |
| |
| /** |
| * Converts a byte array beginning at <code>offset</code> into a 32 bit |
| * integer (little-endian representation) |
| * |
| * @param bytes the byte array |
| * @return The resulting integer |
| */ |
| public int bytesToIntLittleEndian(byte[] bytes) |
| { |
| |
| return ((bytes[0] & 0xff)) | ((bytes[1] & 0xff) << 8) |
| | ((bytes[2] & 0xff) << 16) | ((bytes[3] & 0xff)) << 24; |
| } |
| |
| /** |
| * Converts a byte array beginning at <code>offset</code> into a 32 bit |
| * integer (little-endian representation) |
| * |
| * @param bytes the byte array |
| * @param offset the integer offset into the byte array |
| * @return The resulting integer |
| */ |
| public int bytesToIntLittleEndian(byte[] bytes, int offset) |
| { |
| return ((bytes[offset++] & 0xff)) | ((bytes[offset++] & 0xff) << 8) |
| | ((bytes[offset++] & 0xff) << 16) |
| | ((bytes[offset] & 0xff)) << 24; |
| } |
| |
| /** |
| * This method concatenates a 2-dimensional byte array into a 1-dimensional |
| * byte array |
| * |
| * @param arraycp a 2-dimensional byte array. |
| * @return 1-dimensional byte array with concatenated input array |
| */ |
| public byte[] concatenateArray(byte[][] arraycp) |
| { |
| byte[] dest = new byte[arraycp.length * arraycp[0].length]; |
| int indx = 0; |
| for (int i = 0; i < arraycp.length; i++) |
| { |
| System.arraycopy(arraycp[i], 0, dest, indx, arraycp[i].length); |
| indx = indx + arraycp[i].length; |
| } |
| return dest; |
| } |
| |
| /** |
| * This method prints the values of a 2-dimensional byte array |
| * |
| * @param text a String |
| * @param array a 2-dimensional byte array |
| */ |
| public void printArray(String text, byte[][] array) |
| { |
| System.out.println(text); |
| int counter = 0; |
| for (int i = 0; i < array.length; i++) |
| { |
| for (int j = 0; j < array[0].length; j++) |
| { |
| System.out.println(counter + "; " + array[i][j]); |
| counter++; |
| } |
| } |
| } |
| |
| /** |
| * This method prints the values of a 1-dimensional byte array |
| * |
| * @param text a String |
| * @param array a 1-dimensional byte array. |
| */ |
| public void printArray(String text, byte[] array) |
| { |
| System.out.println(text); |
| int counter = 0; |
| for (int i = 0; i < array.length; i++) |
| { |
| System.out.println(counter + "; " + array[i]); |
| counter++; |
| } |
| } |
| |
| /** |
| * This method tests if an integer is a power of 2. |
| * |
| * @param testValue an integer |
| * @return <code>TRUE</code> if <code>testValue</code> is a power of 2, |
| * <code>FALSE</code> otherwise |
| */ |
| public boolean testPowerOfTwo(int testValue) |
| { |
| int a = 1; |
| while (a < testValue) |
| { |
| a <<= 1; |
| } |
| if (testValue == a) |
| { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** |
| * This method returns the least integer that is greater or equal to the |
| * logarithm to the base 2 of an integer <code>intValue</code>. |
| * |
| * @param intValue an integer |
| * @return The least integer greater or equal to the logarithm to the base 2 |
| * of <code>intValue</code> |
| */ |
| public int getLog(int intValue) |
| { |
| int log = 1; |
| int i = 2; |
| while (i < intValue) |
| { |
| i <<= 1; |
| log++; |
| } |
| return log; |
| } |
| } |