]> www.wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gosthash2012.h
tcl_tests: ca.try: Ignore openssl crl exit status for 'corrupted CRL' test
[openssl-gost/engine.git] / gosthash2012.h
index 51cb0fecfc9db3cfca665b5ae74fd17d6d2991cd..99c9e3d694fd8305d099c1def5b8a114d3381e5e 100644 (file)
 
 #include <string.h>
 
-#ifdef OPENSSL_IA32_SSE2
-# ifdef __MMX__
-#  ifdef __SSE2__
-#   define __GOST3411_HAS_SSE2__
-#  endif
+#ifdef __SSE2__
+# define __GOST3411_HAS_SSE2__
+# if !defined(__x86_64__) && !defined(__e2k__)
+/*
+ * x86-64 bit Linux and Windows ABIs provide malloc function that returns
+ * 16-byte alignment memory buffers required by SSE load/store instructions.
+ * Other platforms require special trick for proper gost2012_hash_ctx structure
+ * allocation. It will be easier to switch to unaligned loadu/storeu memory
+ * access instructions in this case.
+ */
+#  define UNALIGNED_SIMD_ACCESS
+#  pragma message "Use unaligned SIMD memory access"
 # endif
 #endif
 
@@ -27,6 +34,7 @@
 #ifndef L_ENDIAN
 # define __GOST3411_BIG_ENDIAN__
 #endif
+
 #if defined __GOST3411_HAS_SSE2__
 # include "gosthash2012_sse2.h"
 #else
@@ -48,6 +56,7 @@
 ALIGN(16)
 typedef union uint512_u {
     unsigned long long QWORD[8];
+    unsigned char B[64];
 } uint512_u;
 
 #include "gosthash2012_const.h"
@@ -55,7 +64,7 @@ typedef union uint512_u {
 
 /* GOST R 34.11-2012 hash context */
 typedef struct gost2012_hash_ctx {
-    unsigned char buffer[64];
+    union uint512_u buffer;
     union uint512_u h;
     union uint512_u N;
     union uint512_u Sigma;