crypto/modes/modes_lcl.h: let STRICT_ALIGNMENT be on iOS.
authorAndy Polyakov <appro@openssl.org>
Mon, 11 May 2015 09:20:52 +0000 (11:20 +0200)
committerAndy Polyakov <appro@openssl.org>
Wed, 13 May 2015 14:46:44 +0000 (16:46 +0200)
While ARMv7 in general is capable of unaligned access, not all instructions
actually are. And trouble is that compiler doesn't seem to differentiate
those capable and incapable of unaligned access. As result exceptions could
be observed in xts128.c and ccm128.c modules. Contemporary Linux kernels
handle such exceptions by performing requested operation and resuming
execution as is if it succeeded. While on iOS exception is fatal.
Correct solution is to let STRICT_ALIGNMENT be on all ARM platforms,
but doing so is in formal conflict with FIPS maintenance policy.

Reviewed-by: Dr. Stephen Henson <steve@openssl.org>
crypto/modes/modes_lcl.h

index 4dab6a67fe57929d7e9f6b4cb8cb899ddf1093e0..01ad9f34b991ad65575b7c39a327649aa8e02fe2 100644 (file)
@@ -26,13 +26,16 @@ typedef unsigned int u32;
 typedef unsigned char u8;
 
 #define STRICT_ALIGNMENT 1
-#if defined(__i386)    || defined(__i386__)    || \
-    defined(__x86_64)  || defined(__x86_64__)  || \
-    defined(_M_IX86)   || defined(_M_AMD64)    || defined(_M_X64) || \
-    defined(__s390__)  || defined(__s390x__)   || \
-    ( (defined(__arm__)        || defined(__arm)) && \
-      (defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \
-       defined(__ARM_ARCH_7R__)        || defined(__ARM_ARCH_7M__)) )
+#if defined(__i386)     || defined(__i386__)   || \
+    defined(__x86_64)   || defined(__x86_64__) || \
+    defined(_M_IX86)    || defined(_M_AMD64)   || defined(_M_X64) || \
+    defined(__s390__)   || defined(__s390x__)  || \
+    ( \
+    ( (defined(__arm__) || defined(__arm)) && \
+      (defined(__ARM_ARCH_7__)  || defined(__ARM_ARCH_7A__) || \
+       defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__)) ) && \
+    !( defined(__arm__) && defined(__APPLE__) ) \
+    )
 # undef STRICT_ALIGNMENT
 #endif