The Aarch32 assembly code in libcrypto assumes that armv7 supports
unaligned access.  It does, but only if you don't enable the bit that
makes it trap on unaligned access.  And we enable that bit on OpenBSD.
So doing a SHA256 of an unaligned buffer (something ftp(1) ends up
doing) you SIGBUS.

This currently isn't an issue since our base GCC does not advertise
that we're compiling for armv7 and up only.  It barely knows about
armv7 at all.  But with clang that is no longer true.  And we really
want to build for armv7 and up only because that gives us proper
atomic operations and such.

So here is a diff that avoids the unaligned access bits that matter
when compiling on OpenBSD.

ok?

P.S. Ports people might want to apply a similar diff to the OpenSSSL
     port if we still have it.


Index: lib/libcrypto/aes/asm/aes-armv4.pl
===================================================================
RCS file: /cvs/src/lib/libcrypto/aes/asm/aes-armv4.pl,v
retrieving revision 1.2
diff -u -p -r1.2 aes-armv4.pl
--- lib/libcrypto/aes/asm/aes-armv4.pl  9 Jul 2014 09:10:07 -0000       1.2
+++ lib/libcrypto/aes/asm/aes-armv4.pl  29 Dec 2017 09:38:11 -0000
@@ -172,7 +172,7 @@ AES_encrypt:
        mov     $rounds,r0              @ inp
        mov     $key,r2
        sub     $tbl,r3,#AES_encrypt-AES_Te     @ Te
-#if __ARM_ARCH__<7
+#if __ARM_ARCH__<7 || defined(__OpenBSD__)
        ldrb    $s0,[$rounds,#3]        @ load input data in endian-neutral
        ldrb    $t1,[$rounds,#2]        @ manner...
        ldrb    $t2,[$rounds,#1]
@@ -216,7 +216,7 @@ AES_encrypt:
        bl      _armv4_AES_encrypt
 
        ldr     $rounds,[sp],#4         @ pop out
-#if __ARM_ARCH__>=7
+#if __ARM_ARCH__>=7 && !defined(__OpenBSD__)
 #ifdef __ARMEL__
        rev     $s0,$s0
        rev     $s1,$s1
@@ -432,7 +432,7 @@ _armv4_AES_set_encrypt_key:
        mov     lr,r1                   @ bits
        mov     $key,r2                 @ key
 
-#if __ARM_ARCH__<7
+#if __ARM_ARCH__<7 || defined(__OpenBSD__)
        ldrb    $s0,[$rounds,#3]        @ load input data in endian-neutral
        ldrb    $t1,[$rounds,#2]        @ manner...
        ldrb    $t2,[$rounds,#1]
@@ -517,7 +517,7 @@ _armv4_AES_set_encrypt_key:
        b       .Ldone
 
 .Lnot128:
-#if __ARM_ARCH__<7
+#if __ARM_ARCH__<7 || defined(__OpenBSD__)
        ldrb    $i2,[$rounds,#19]
        ldrb    $t1,[$rounds,#18]
        ldrb    $t2,[$rounds,#17]
@@ -588,7 +588,7 @@ _armv4_AES_set_encrypt_key:
        b       .L192_loop
 
 .Lnot192:
-#if __ARM_ARCH__<7
+#if __ARM_ARCH__<7 || defined(__OpenBSD__)
        ldrb    $i2,[$rounds,#27]
        ldrb    $t1,[$rounds,#26]
        ldrb    $t2,[$rounds,#25]
@@ -888,7 +888,7 @@ AES_decrypt:
        mov     $rounds,r0              @ inp
        mov     $key,r2
        sub     $tbl,r3,#AES_decrypt-AES_Td             @ Td
-#if __ARM_ARCH__<7
+#if __ARM_ARCH__<7 || defined(__OpenBSD__)
        ldrb    $s0,[$rounds,#3]        @ load input data in endian-neutral
        ldrb    $t1,[$rounds,#2]        @ manner...
        ldrb    $t2,[$rounds,#1]
@@ -932,7 +932,7 @@ AES_decrypt:
        bl      _armv4_AES_decrypt
 
        ldr     $rounds,[sp],#4         @ pop out
-#if __ARM_ARCH__>=7
+#if __ARM_ARCH__>=7 && !defined(__OpenBSD__)
 #ifdef __ARMEL__
        rev     $s0,$s0
        rev     $s1,$s1
Index: lib/libcrypto/sha/asm/sha1-armv4-large.pl
===================================================================
RCS file: /cvs/src/lib/libcrypto/sha/asm/sha1-armv4-large.pl,v
retrieving revision 1.1.1.4
diff -u -p -r1.1.1.4 sha1-armv4-large.pl
--- lib/libcrypto/sha/asm/sha1-armv4-large.pl   13 Apr 2014 15:16:35 -0000      
1.1.1.4
+++ lib/libcrypto/sha/asm/sha1-armv4-large.pl   29 Dec 2017 09:38:11 -0000
@@ -95,7 +95,7 @@ ___
 sub BODY_00_15 {
 my ($a,$b,$c,$d,$e)=@_;
 $code.=<<___;
-#if __ARM_ARCH__<7
+#if __ARM_ARCH__<7 || defined(__OpenBSD__)
        ldrb    $t1,[$inp,#2]
        ldrb    $t0,[$inp,#3]
        ldrb    $t2,[$inp,#1]
Index: lib/libcrypto/sha/asm/sha256-armv4.pl
===================================================================
RCS file: /cvs/src/lib/libcrypto/sha/asm/sha256-armv4.pl,v
retrieving revision 1.1.1.3
diff -u -p -r1.1.1.3 sha256-armv4.pl
--- lib/libcrypto/sha/asm/sha256-armv4.pl       13 Oct 2012 21:23:43 -0000      
1.1.1.3
+++ lib/libcrypto/sha/asm/sha256-armv4.pl       29 Dec 2017 09:38:11 -0000
@@ -51,7 +51,7 @@ sub BODY_00_15 {
 my ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_;
 
 $code.=<<___ if ($i<16);
-#if __ARM_ARCH__>=7
+#if __ARM_ARCH__>=7 && !defined(__OpenBSD__)
        ldr     $T1,[$inp],#4
 #else
        ldrb    $T1,[$inp,#3]                   @ $i
@@ -70,7 +70,7 @@ $code.=<<___;
        eor     $t1,$f,$g
 #if $i>=16
        add     $T1,$T1,$t3                     @ from BODY_16_xx
-#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
+#elif __ARM_ARCH__>=7 && defined(__ARMEL__) && !defined(__OpenBSD__)
        rev     $T1,$T1
 #endif
 #if $i==15
Index: lib/libcrypto/sha/asm/sha512-armv4.pl
===================================================================
RCS file: /cvs/src/lib/libcrypto/sha/asm/sha512-armv4.pl,v
retrieving revision 1.1.1.3
diff -u -p -r1.1.1.3 sha512-armv4.pl
--- lib/libcrypto/sha/asm/sha512-armv4.pl       13 Oct 2012 21:23:43 -0000      
1.1.1.3
+++ lib/libcrypto/sha/asm/sha512-armv4.pl       29 Dec 2017 09:38:11 -0000
@@ -270,7 +270,7 @@ sha512_block_data_order:
        str     $Thi,[sp,#$Foff+4]
 
 .L00_15:
-#if __ARM_ARCH__<7
+#if __ARM_ARCH__<7 || defined(__OpenBSD__)
        ldrb    $Tlo,[$inp,#7]
        ldrb    $t0, [$inp,#6]
        ldrb    $t1, [$inp,#5]

Reply via email to