/****************************************************************************************************************************************** * Description: Hash Function to Generate C' for Heuristic qTESLA Security Category-1 and Category-3 (Option for Size or Speed) ******************************************************************************************************************************************/ private static void hashFunction(byte[] output, int outputOffset, int[] V, final byte[] message, int messageOffset, int n, int d, int q) { int mask; int cL; byte[] T = new byte[n + Polynomial.MESSAGE]; for (int i = 0; i < n; i++) { /* If V[i] > Q / 2 Then V[i] = V[i] - Q */ mask = (q / 2 - V[i]) >> 31; V[i] = ((V[i] - q) & mask) | (V[i] & (~mask)); cL = V[i] & ((1 << d) - 1); /* If cL > 2 ^ (d - 1) Then cL = cL - 2 ^ d */ mask = ((1 << (d - 1)) - cL) >> 31; cL = ((cL - (1 << d)) & mask) | (cL & (~mask)); T[i] = (byte)((V[i] - cL) >> d); } System.arraycopy(message, messageOffset, T, n, Polynomial.MESSAGE); if (q == Parameter.Q_I) { HashUtils.secureHashAlgorithmKECCAK128(output, outputOffset, Polynomial.HASH, T, 0, n + Polynomial.MESSAGE); } if (q == Parameter.Q_III_SIZE || q == Parameter.Q_III_SPEED) { HashUtils.secureHashAlgorithmKECCAK256(output, outputOffset, Polynomial.HASH, T, 0, n + Polynomial.MESSAGE); } }
HashUtils.secureHashAlgorithmKECCAK128(output, outputOffset, Polynomial.HASH, T, 0, n * k + Polynomial.MESSAGE);
HashUtils.secureHashAlgorithmKECCAK128(randomnessExtended, 0, Polynomial.SEED * 4, randomness, 0, Polynomial.RANDOM); HashUtils.secureHashAlgorithmKECCAK128( randomnessExtended, 0, Polynomial.SEED * (k + 3), randomness, 0, Polynomial.RANDOM ); HashUtils.secureHashAlgorithmKECCAK128( randomnessInput, Polynomial.RANDOM + Polynomial.SEED, Polynomial.MESSAGE, message, 0, messageLength ); HashUtils.secureHashAlgorithmKECCAK128( randomness, 0, Polynomial.SEED, randomnessInput, 0, Polynomial.RANDOM + Polynomial.SEED + Polynomial.MESSAGE ); HashUtils.secureHashAlgorithmKECCAK128( randomnessInput, Polynomial.RANDOM + Polynomial.SEED, Polynomial.MESSAGE, message, 0, messageLength ); HashUtils.secureHashAlgorithmKECCAK128( randomness, 0, Polynomial.SEED, randomnessInput, 0, Polynomial.RANDOM + Polynomial.SEED + Polynomial.MESSAGE ); HashUtils.secureHashAlgorithmKECCAK128( hashMessage, 0, Polynomial.MESSAGE, message, 0, message.length ); HashUtils.secureHashAlgorithmKECCAK128( hashMessage, 0, Polynomial.MESSAGE, message, 0, message.length );