From fc66d1bd0d3db6392424a1fd10dcf4343ce72c52 Mon Sep 17 00:00:00 2001
From: Frank Denis <github@pureftpd.org>
Date: Wed, 7 Jan 2026 12:00:49 +0100
Subject: [PATCH] Fix compilation with GCC on aarch64

Use unsigned NEON intrinsics everywhere

Fixes #1502

Upstream-Status: Backport [https://github.com/jedisct1/libsodium/commit/6702f69bef6044163acc7715e6ac7e430890ce78]
---
 src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c b/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c
index c5a27e92..bad4ce38 100644
--- a/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c
+++ b/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c
@@ -37,7 +37,7 @@ typedef uint64x2_t BlockVec;
 #    define XOR128_3(a, b, c) veorq_u64(veorq_u64((a), (b)), (c))
 #    define SET64x2(a, b)     vsetq_lane_u64((uint64_t) (a), vmovq_n_u64((uint64_t) (b)), 1)
 #    define BYTESHL128(a, b) \
-        vreinterpretq_u64_u8(vextq_s8(vdupq_n_s8(0), vreinterpretq_s8_u64(a), 16 - (b)))
+        vreinterpretq_u64_u8(vextq_u8(vdupq_n_u8(0), vreinterpretq_u8_u64(a), 16 - (b)))
 
 #    define AES_XENCRYPT(block_vec, rkey) \
         vreinterpretq_u64_u8(             \
@@ -348,12 +348,12 @@ pfx_set_bit(uint8_t ip16[16], const unsigned int bit_index, const uint8_t bit_va
 static void
 pfx_shift_left(uint8_t ip16[16])
 {
-    BlockVec       v       = LOAD128(ip16);
-    const BlockVec shl     = vshlq_n_u8(vreinterpretq_u8_u64(v), 1);
-    const BlockVec msb     = vshrq_n_u8(vreinterpretq_u8_u64(v), 7);
-    const BlockVec zero    = vdupq_n_u8(0);
-    const BlockVec carries = vextq_u8(vreinterpretq_u8_u64(msb), zero, 1);
-    v                      = vreinterpretq_u64_u8(vorrq_u8(shl, carries));
+    BlockVec         v       = LOAD128(ip16);
+    const uint8x16_t shl     = vshlq_n_u8(vreinterpretq_u8_u64(v), 1);
+    const uint8x16_t msb     = vshrq_n_u8(vreinterpretq_u8_u64(v), 7);
+    const uint8x16_t zero    = vdupq_n_u8(0);
+    const uint8x16_t carries = vextq_u8(msb, zero, 1);
+    v                        = vreinterpretq_u64_u8(vorrq_u8(shl, carries));
     STORE128(ip16, v);
 }
 
-- 
2.47.3

