diff --git a/sys/crypto/aes.c b/sys/crypto/aes.c
index c8809640c7f157fae517c51e9c8beb57f6bb4c87..2eccf0169982ea77f068a02f604385c2e4b69dd8 100644
--- a/sys/crypto/aes.c
+++ b/sys/crypto/aes.c
@@ -471,7 +471,12 @@ static const u32 Td0[256] = {
     #define Td1(n)  ((Td0[n] >>  8) | (Td0[n] << 24))
     #define Td2(n)  ((Td0[n] >> 16) | (Td0[n] << 16))
     #define Td3(n)  ((Td0[n] >> 24) | (Td0[n] <<  8))
-    #define Td4(n)  (Td4[n] | (Td4[n] << 8) | (Td4[n] << 16) | (Td4[n] << 24))
+
+    /* helper to prevent the u8 to be promoted to signed int, which would turn
+     * left shift by 24 into undefined behaviour */
+    #define Td4u(n) ((u32)Td4[n])
+
+    #define Td4(n)  (Td4u(n) | (Td4u(n) << 8) | (Td4u(n) << 16) | (Td4u(n)  << 24))
 
 static const u8 Td4[256] = {
     0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,