#ifndef SPX_HARAKA_H\r
#define SPX_HARAKA_H\r
\r
+#if defined(__arm__) || defined(__aarch64__)\r
+#include "crypto/SSE2NEON.h"\r
+#else\r
+#include "immintrin.h"\r
+#endif\r
+\r
+#define NUMROUNDS 5\r
+\r
+#ifdef _WIN32\r
+typedef unsigned long long u64;\r
+#else\r
+typedef unsigned long u64;\r
+#endif\r
+typedef __m128i u128;\r
+\r
+extern void aesenc(unsigned char *s, const unsigned char *rk);\r
+\r
+#define AES2_EMU(s0, s1, rci) \\r
+ aesenc((unsigned char *)&s0, (unsigned char *)&(rc[rci])); \\r
+ aesenc((unsigned char *)&s1, (unsigned char *)&(rc[rci + 1])); \\r
+ aesenc((unsigned char *)&s0, (unsigned char *)&(rc[rci + 2])); \\r
+ aesenc((unsigned char *)&s1, (unsigned char *)&(rc[rci + 3]));\r
+\r
+static inline void mix2_emu(__m128i *s0, __m128i *s1)\r
+{\r
+ __m128i tmp;\r
+ tmp = (*s0 & 0xffffffff) | ((*s1 & 0xffffffff) << 32) | ((*s0 & 0xffffffff00000000) << 32) | ((*s1 & 0xffffffff00000000) << 64);\r
+ *s1 = ((*s0 >> 64) & 0xffffffff) | (((*s1 >> 64) & 0xffffffff) << 32) | (((*s0 >> 64) & 0xffffffff00000000) << 32) | (((*s1 >> 64) & 0xffffffff00000000) << 64);\r
+ *s0 = tmp;\r
+}\r
+\r
+typedef unsigned int uint32_t;\r
+\r
+static inline __m128i _mm_unpacklo_epi32_emu(__m128i a, __m128i b)\r
+{\r
+ uint32_t result[4];\r
+ uint32_t *tmp1 = (uint32_t *)&a, *tmp2 = (uint32_t *)&b;\r
+ result[0] = tmp1[0];\r
+ result[1] = tmp2[0];\r
+ result[2] = tmp1[1];\r
+ result[3] = tmp2[1];\r
+ return *(__m128i *)result;\r
+}\r
+\r
+static inline __m128i _mm_unpackhi_epi32_emu(__m128i a, __m128i b)\r
+{\r
+ uint32_t result[4];\r
+ uint32_t *tmp1 = (uint32_t *)&a, *tmp2 = (uint32_t *)&b;\r
+ result[0] = tmp1[2];\r
+ result[1] = tmp2[2];\r
+ result[2] = tmp1[3];\r
+ result[3] = tmp2[3];\r
+ return *(__m128i *)result;\r
+}\r
+\r
+#define MIX2_EMU(s0, s1) \\r
+ tmp = _mm_unpacklo_epi32_emu(s0, s1); \\r
+ s1 = _mm_unpackhi_epi32_emu(s0, s1); \\r
+ s0 = tmp;\r
+\r
/* load constants */\r
void load_constants_port();\r
\r
/* Implementation of Haraka-512 */\r
void haraka512_port(unsigned char *out, const unsigned char *in);\r
\r
+/* Implementation of Haraka-512 */\r
+void haraka512_port_keyed(unsigned char *out, const unsigned char *in, const u128 *rc);\r
+\r
/* Applies the 512-bit Haraka permutation to in, using zero key. */\r
void haraka512_perm_zero(unsigned char *out, const unsigned char *in);\r
\r