]> Git Repo - VerusCoin.git/blobdiff - src/crypto/haraka_portable.h
Integrate CValidationState error checking with identity validate functions
[VerusCoin.git] / src / crypto / haraka_portable.h
index dcc4f65aef475af768ee32db00420a80bbf01c9c..31cfb35a1d23b1fa20721727d50f8ae0c6b9ecbc 100644 (file)
@@ -1,6 +1,66 @@
 #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
@@ -18,6 +78,9 @@ void haraka512_perm(unsigned char *out, const unsigned char *in);
 /* 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
This page took 0.039167 seconds and 4 git commands to generate.