diff --git a/ChangeLog b/ChangeLog
index 643c38b4591deda878f950cb16b7409d9e369dc7..a2cdefa0ab0377f3368004d7db0022a4e162c68d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2022-07-11  Niels Möller  <nisse@lysator.liu.se>
+
+	* arm64/crypto/sha256-compress-n.asm: New file. replacing...
+	* arm64/crypto/sha256-compress.asm: ...deleted file.
+	* arm64/fat/sha256-compress-n-2.asm: New file. replacing...
+	* arm64/fat/sha256-compress-2.asm: ...deleted file.
+	* fat-arm64.c: Update fat setup.
+
 2022-07-05  Niels Möller  <nisse@lysator.liu.se>
 
 	* md-internal.h (MD_FILL_OR_RETURN): New file, new macro.
diff --git a/arm64/crypto/sha256-compress.asm b/arm64/crypto/sha256-compress-n.asm
similarity index 93%
rename from arm64/crypto/sha256-compress.asm
rename to arm64/crypto/sha256-compress-n.asm
index 2bddea059beea8ce32b8ca2d81aca56e1a7c1ffc..447dc590f23bd2002b1c00bde65d681f74f35f4a 100644
--- a/arm64/crypto/sha256-compress.asm
+++ b/arm64/crypto/sha256-compress-n.asm
@@ -1,4 +1,4 @@
-C arm64/crypto/sha256-compress.asm
+C arm64/crypto/sha256-compress-n.asm
 
 ifelse(`
    Copyright (C) 2021 Mamone Tarsha
@@ -37,7 +37,7 @@ C SHA256H2: SHA256 hash update (part 2)
 C SHA256SU0: SHA256 schedule update 0
 C SHA256SU1: SHA256 schedule update 1
 
-.file "sha256-compress.asm"
+.file "sha256-compress-n.asm"
 .arch armv8-a+crypto
 
 .text
@@ -45,8 +45,9 @@ C SHA256SU1: SHA256 schedule update 1
 C Register usage:
 
 define(`STATE', `x0')
-define(`INPUT', `x1')
-define(`K', `x2')
+define(`K', `x1')
+define(`BLOCKS', `x2')
+define(`INPUT', `x3')
 
 define(`MSG0', `v0')
 define(`MSG1', `v1')
@@ -59,19 +60,23 @@ define(`TMP', `v7')
 define(`STATE0_SAVED', `v16')
 define(`STATE1_SAVED', `v17')
 
-C void 
-C _nettle_sha256_compress(uint32_t *state, const uint8_t *input, const uint32_t *k)
+C const uint8_t *
+C _nettle_sha256_compress_n(uint32_t *state, const uint32_t *k,
+C                           size_t blocks, const uint8_t *input)
+
+PROLOGUE(_nettle_sha256_compress_n)
+    cbz            BLOCKS, .Lend
 
-PROLOGUE(_nettle_sha256_compress)
     C Load state
     ld1            {STATE0.4s,STATE1.4s},[STATE]
 
+.Loop:
     C Save state
     mov            STATE0_SAVED.16b,STATE0.16b
     mov            STATE1_SAVED.16b,STATE1.16b
 
     C Load message
-    ld1            {MSG0.16b,MSG1.16b,MSG2.16b,MSG3.16b},[INPUT]
+    ld1            {MSG0.16b,MSG1.16b,MSG2.16b,MSG3.16b},[INPUT],#64
     
     C Reverse for little endian
     rev32          MSG0.16b,MSG0.16b
@@ -217,9 +222,13 @@ PROLOGUE(_nettle_sha256_compress)
     C Combine state
     add            STATE0.4s,STATE0.4s,STATE0_SAVED.4s
     add            STATE1.4s,STATE1.4s,STATE1_SAVED.4s
-	
+    subs           BLOCKS, BLOCKS, #1
+    sub            K, K, #240
+    b.ne           .Loop
+
     C Store state
     st1            {STATE0.4s,STATE1.4s},[STATE]
-
+.Lend:
+    mov            x0, INPUT
     ret
-EPILOGUE(_nettle_sha256_compress)
+EPILOGUE(_nettle_sha256_compress_n)
diff --git a/arm64/fat/sha256-compress-2.asm b/arm64/fat/sha256-compress-n-2.asm
similarity index 87%
rename from arm64/fat/sha256-compress-2.asm
rename to arm64/fat/sha256-compress-n-2.asm
index 67590794486e650eb1d2ebbf6e410e52737d7110..2f70686e2c8dc42b288b7838871cd5a63e248ea5 100644
--- a/arm64/fat/sha256-compress-2.asm
+++ b/arm64/fat/sha256-compress-n-2.asm
@@ -1,4 +1,4 @@
-C arm64/fat/sha256-compress-2.asm
+C arm64/fat/sha256-compress-n-2.asm
 
 
 ifelse(`
@@ -31,7 +31,7 @@ ifelse(`
    not, see http://www.gnu.org/licenses/.
 ')
 
-dnl PROLOGUE(_nettle_sha256_compress) picked up by configure
+dnl PROLOGUE(_nettle_sha256_compress_n) picked up by configure
 
 define(`fat_transform', `$1_arm64')
-include_src(`arm64/crypto/sha256-compress.asm')
+include_src(`arm64/crypto/sha256-compress-n.asm')
diff --git a/fat-arm64.c b/fat-arm64.c
index f2b8493d03d283233344aff710498d5c22ff0318..aec99f663623de9c43a3c4f729fa1d09ce4eca0d 100644
--- a/fat-arm64.c
+++ b/fat-arm64.c
@@ -178,9 +178,9 @@ DECLARE_FAT_FUNC(nettle_sha1_compress, sha1_compress_func)
 DECLARE_FAT_FUNC_VAR(sha1_compress, sha1_compress_func, c)
 DECLARE_FAT_FUNC_VAR(sha1_compress, sha1_compress_func, arm64)
 
-DECLARE_FAT_FUNC(_nettle_sha256_compress, sha256_compress_func)
-DECLARE_FAT_FUNC_VAR(sha256_compress, sha256_compress_func, c)
-DECLARE_FAT_FUNC_VAR(sha256_compress, sha256_compress_func, arm64)
+DECLARE_FAT_FUNC(_nettle_sha256_compress_n, sha256_compress_n_func)
+DECLARE_FAT_FUNC_VAR(sha256_compress_n, sha256_compress_n_func, c)
+DECLARE_FAT_FUNC_VAR(sha256_compress_n, sha256_compress_n_func, arm64)
 
 static void CONSTRUCTOR
 fat_init (void)
@@ -250,11 +250,11 @@ fat_init (void)
     {
       if (verbose)
 	fprintf (stderr, "libnettle: enabling hardware-accelerated sha256 compress code.\n");
-      _nettle_sha256_compress_vec = _nettle_sha256_compress_arm64;
+      _nettle_sha256_compress_n_vec = _nettle_sha256_compress_n_arm64;
     }
   else
     {
-      _nettle_sha256_compress_vec = _nettle_sha256_compress_c;
+      _nettle_sha256_compress_n_vec = _nettle_sha256_compress_n_c;
     }
 }
 
@@ -297,6 +297,7 @@ DEFINE_FAT_FUNC(nettle_sha1_compress, void,
 		(uint32_t *state, const uint8_t *input),
 		(state, input))
 
-DEFINE_FAT_FUNC(_nettle_sha256_compress, void,
-		(uint32_t *state, const uint8_t *input, const uint32_t *k),
-		(state, input, k))
+DEFINE_FAT_FUNC(_nettle_sha256_compress_n, const uint8_t *,
+		(uint32_t *state, const uint32_t *k,
+		 size_t blocks, const uint8_t *input),
+		(state, k, blocks, input))