summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiu-ErMeng <liuermeng2@huawei.com>2023-04-27 11:14:02 +0800
committerTomas Mraz <tomas@openssl.org>2023-04-28 14:36:35 +0200
commit004bd8f97d11bb7ac5f2de89f7060e03222b60fe (patch)
treeaffc152d6071c2a910a8d2d5178f2b04ced4c057
parent06565f36e78e6155834875ad544bb48838a812e4 (diff)
downloadopenssl-new-004bd8f97d11bb7ac5f2de89f7060e03222b60fe.tar.gz
fix md5 bug on aarch64 big-endian plantform.
Signed-off-by: Liu-ErMeng <liuermeng2@huawei.com> Reviewed-by: Tom Cosgrove <tom.cosgrove@arm.com> Reviewed-by: Paul Dale <pauli@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/20829)
-rwxr-xr-xcrypto/md5/asm/md5-aarch64.pl45
-rw-r--r--crypto/md5/build.info5
2 files changed, 35 insertions, 15 deletions
diff --git a/crypto/md5/asm/md5-aarch64.pl b/crypto/md5/asm/md5-aarch64.pl
index 94d727fc9c..41f81051bb 100755
--- a/crypto/md5/asm/md5-aarch64.pl
+++ b/crypto/md5/asm/md5-aarch64.pl
@@ -28,7 +28,6 @@ open OUT,"| \"$^X\" $xlate $flavour \"$output\""
*STDOUT=*OUT;
$code .= <<EOF;
-
.text
.globl ossl_md5_block_asm_data_order
.type ossl_md5_block_asm_data_order,\@function
@@ -46,7 +45,14 @@ ossl_md5_block_asm_data_order:
ossl_md5_blocks_loop:
eor x17, x12, x13 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
and x16, x17, x11 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
- ldp x15, x3, [x1] // Load 4 words of input data0 M[0]/0
+ ldp w15, w20, [x1] // Load 2 words of input data0 M[0],M[1]
+ ldp w3, w21, [x1, #8] // Load 2 words of input data0 M[2],M[3]
+#ifdef __AARCH64EB__
+ rev w15, w15
+ rev w20, w20
+ rev w3, w3
+ rev w21, w21
+#endif
eor x14, x16, x13 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x9, #0xa478 // Load lower half of constant 0xd76aa478
movk x9, #0xd76a, lsl #16 // Load upper half of constant 0xd76aa478
@@ -60,7 +66,6 @@ ossl_md5_blocks_loop:
eor x17, x8, x12 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x16, #0xb756 // Load lower half of constant 0xe8c7b756
movk x16, #0xe8c7, lsl #16 // Load upper half of constant 0xe8c7b756
- lsr x20, x15, #32 // Right shift high input value containing M[1]
add w9, w13, w20 // Add dest value
add w7, w9, w16 // Add constant 0xe8c7b756
add w14, w7, w17 // Add aux function result
@@ -81,14 +86,20 @@ ossl_md5_blocks_loop:
eor x16, x7, x4 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x9, #0xceee // Load lower half of constant 0xc1bdceee
movk x9, #0xc1bd, lsl #16 // Load upper half of constant 0xc1bdceee
- lsr x21, x3, #32 // Right shift high input value containing M[3]
add w14, w11, w21 // Add dest value
add w6, w14, w9 // Add constant 0xc1bdceee
add w7, w6, w16 // Add aux function result
ror w7, w7, #10 // Rotate left s=22 bits
eor x17, x8, x5 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
add w9, w8, w7 // Add X parameter round 1 B=FF(B, C, D, A, 0xc1bdceee, s=22, M[3])
- ldp x14, x7, [x1, #16] // Load 4 words of input data0 M[4]/0w
+ ldp w14, w22, [x1, #16] // Load 2 words of input data0 M[4],M[5]
+ ldp w7, w23, [x1, #24] // Load 2 words of input data0 M[6],M[7]
+#ifdef __AARCH64EB__
+ rev w14, w14
+ rev w22, w22
+ rev w7, w7
+ rev w23, w23
+#endif
and x16, x17, x9 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
eor x6, x16, x5 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x16, #0xfaf // Load lower half of constant 0xf57c0faf
@@ -103,7 +114,6 @@ ossl_md5_blocks_loop:
eor x6, x16, x8 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x4, #0xc62a // Load lower half of constant 0x4787c62a
movk x4, #0x4787, lsl #16 // Load upper half of constant 0x4787c62a
- lsr x22, x14, #32 // Right shift high input value containing M[5]
add w16, w5, w22 // Add dest value
add w16, w16, w4 // Add constant 0x4787c62a
add w5, w16, w6 // Add aux function result
@@ -124,14 +134,20 @@ ossl_md5_blocks_loop:
eor x4, x5, x17 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x6, #0x9501 // Load lower half of constant 0xfd469501
movk x6, #0xfd46, lsl #16 // Load upper half of constant 0xfd469501
- lsr x23, x7, #32 // Right shift high input value containing M[7]
add w9, w9, w23 // Add dest value
add w5, w9, w6 // Add constant 0xfd469501
add w9, w5, w4 // Add aux function result
ror w9, w9, #10 // Rotate left s=22 bits
eor x6, x8, x19 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
add w4, w8, w9 // Add X parameter round 1 B=FF(B, C, D, A, 0xfd469501, s=22, M[7])
- ldp x5, x16, [x1, #32] // Load 4 words of input data0 M[8]/0
+ ldp w5, w24, [x1, #32] // Load 2 words of input data0 M[8],M[9]
+ ldp w16, w25, [x1, #40] // Load 2 words of input data0 M[10],M[11]
+#ifdef __AARCH64EB__
+ rev w5, w5
+ rev w24, w24
+ rev w16, w16
+ rev w25, w25
+#endif
and x9, x6, x4 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
eor x6, x9, x19 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x9, #0x98d8 // Load lower half of constant 0x698098d8
@@ -146,7 +162,6 @@ ossl_md5_blocks_loop:
eor x9, x17, x8 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x17, #0xf7af // Load lower half of constant 0x8b44f7af
movk x17, #0x8b44, lsl #16 // Load upper half of constant 0x8b44f7af
- lsr x24, x5, #32 // Right shift high input value containing M[9]
add w19, w19, w24 // Add dest value
add w17, w19, w17 // Add constant 0x8b44f7af
add w19, w17, w9 // Add aux function result
@@ -167,14 +182,20 @@ ossl_md5_blocks_loop:
eor x9, x9, x6 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x11, #0xd7be // Load lower half of constant 0x895cd7be
movk x11, #0x895c, lsl #16 // Load upper half of constant 0x895cd7be
- lsr x25, x16, #32 // Right shift high input value containing M[11]
add w4, w4, w25 // Add dest value
add w4, w4, w11 // Add constant 0x895cd7be
add w9, w4, w9 // Add aux function result
ror w9, w9, #10 // Rotate left s=22 bits
eor x4, x8, x17 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
add w9, w8, w9 // Add X parameter round 1 B=FF(B, C, D, A, 0x895cd7be, s=22, M[11])
- ldp x11, x12, [x1, #48] // Load 4 words of input data0 M[12]/0
+ ldp w11, w26, [x1, #48] // Load 2 words of input data0 M[12],M[13]
+ ldp w12, w27, [x1, #56] // Load 2 words of input data0 M[14],M[15]
+#ifdef __AARCH64EB__
+ rev w11, w11
+ rev w26, w26
+ rev w12, w12
+ rev w27, w27
+#endif
and x4, x4, x9 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
eor x4, x4, x17 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x19, #0x1122 // Load lower half of constant 0x6b901122
@@ -189,7 +210,6 @@ ossl_md5_blocks_loop:
eor x6, x6, x8 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x19, #0x7193 // Load lower half of constant 0xfd987193
movk x19, #0xfd98, lsl #16 // Load upper half of constant 0xfd987193
- lsr x26, x11, #32 // Right shift high input value containing M[13]
add w17, w17, w26 // Add dest value
add w17, w17, w19 // Add constant 0xfd987193
add w17, w17, w6 // Add aux function result
@@ -210,7 +230,6 @@ ossl_md5_blocks_loop:
eor x6, x6, x4 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
movz x13, #0x821 // Load lower half of constant 0x49b40821
movk x13, #0x49b4, lsl #16 // Load upper half of constant 0x49b40821
- lsr x27, x12, #32 // Right shift high input value containing M[15]
add w9, w9, w27 // Add dest value
add w9, w9, w13 // Add constant 0x49b40821
add w9, w9, w6 // Add aux function result
diff --git a/crypto/md5/build.info b/crypto/md5/build.info
index 34f29faf76..5d89a37883 100644
--- a/crypto/md5/build.info
+++ b/crypto/md5/build.info
@@ -4,7 +4,7 @@ $MD5ASM=
IF[{- !$disabled{asm} -}]
$MD5ASM_x86=md5-586.S
$MD5ASM_x86_64=md5-x86_64.s
- $MD5ASM_aarch64=md5-aarch64.s
+ $MD5ASM_aarch64=md5-aarch64.S
$MD5ASM_sparcv9=md5-sparcv9.S
# Now that we have defined all the arch specific variables, use the
@@ -36,7 +36,8 @@ DEFINE[../../providers/liblegacy.a]=$MD5DEF
GENERATE[md5-586.S]=asm/md5-586.pl
GENERATE[md5-x86_64.s]=asm/md5-x86_64.pl
-GENERATE[md5-aarch64.s]=asm/md5-aarch64.pl
+GENERATE[md5-aarch64.S]=asm/md5-aarch64.pl
+INCLUDE[md5-aarch64.o]=..
GENERATE[md5-sparcv9.S]=asm/md5-sparcv9.pl
INCLUDE[md5-sparcv9.o]=..