Skip to content

Commit acdda5d

Browse files
committed
Cast STORE64H/STORE64L argument to ulong64
Avoids undefined behaviour with right shift greater than 32 bits
1 parent 14ed10c commit acdda5d

File tree

1 file changed

+24
-24
lines changed

1 file changed

+24
-24
lines changed

src/headers/tomcrypt_macros.h

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
((ulong32)((y)[0] & 255)); } while(0)
2222

2323
#define STORE64L(x, y) \
24-
do { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
25-
(y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
26-
(y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
27-
(y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0)
24+
do { (y)[7] = (unsigned char)(((ulong64)(x)>>56)&255); (y)[6] = (unsigned char)(((ulong64)(x)>>48)&255); \
25+
(y)[5] = (unsigned char)(((ulong64)(x)>>40)&255); (y)[4] = (unsigned char)(((ulong64)(x)>>32)&255); \
26+
(y)[3] = (unsigned char)(((ulong64)(x)>>24)&255); (y)[2] = (unsigned char)(((ulong64)(x)>>16)&255); \
27+
(y)[1] = (unsigned char)(((ulong64)(x)>>8)&255); (y)[0] = (unsigned char)((ulong64)(x)&255); } while(0)
2828

2929
#define LOAD64L(x, y) \
3030
do { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
@@ -43,10 +43,10 @@
4343
((ulong32)((y)[3] & 255)); } while(0)
4444

4545
#define STORE64H(x, y) \
46-
do { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
47-
(y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
48-
(y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
49-
(y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } while(0)
46+
do { (y)[0] = (unsigned char)(((ulong64)(x)>>56)&255); (y)[1] = (unsigned char)(((ulong64)(x)>>48)&255); \
47+
(y)[2] = (unsigned char)(((ulong64)(x)>>40)&255); (y)[3] = (unsigned char)(((ulong64)(x)>>32)&255); \
48+
(y)[4] = (unsigned char)(((ulong64)(x)>>24)&255); (y)[5] = (unsigned char)(((ulong64)(x)>>16)&255); \
49+
(y)[6] = (unsigned char)(((ulong64)(x)>>8)&255); (y)[7] = (unsigned char)((ulong64)(x)&255); } while(0)
5050

5151
#define LOAD64H(x, y) \
5252
do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
@@ -125,10 +125,10 @@ asm __volatile__ ( \
125125
#else
126126

127127
#define STORE64H(x, y) \
128-
do { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
129-
(y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
130-
(y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
131-
(y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } while(0)
128+
do { (y)[0] = (unsigned char)(((ulong64)(x)>>56)&255); (y)[1] = (unsigned char)(((ulong64)(x)>>48)&255); \
129+
(y)[2] = (unsigned char)(((ulong64)(x)>>40)&255); (y)[3] = (unsigned char)(((ulong64)(x)>>32)&255); \
130+
(y)[4] = (unsigned char)(((ulong64)(x)>>24)&255); (y)[5] = (unsigned char)(((ulong64)(x)>>16)&255); \
131+
(y)[6] = (unsigned char)(((ulong64)(x)>>8)&255); (y)[7] = (unsigned char)((ulong64)(x)&255); } while(0)
132132

133133
#define LOAD64H(x, y) \
134134
do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
@@ -147,10 +147,10 @@ do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
147147
do { XMEMCPY(&(x), y, 4); } while(0)
148148

149149
#define STORE64L(x, y) \
150-
do { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
151-
(y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
152-
(y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
153-
(y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0)
150+
do { (y)[7] = (unsigned char)(((ulong64)(x))>>56)&255); (y)[6] = (unsigned char)((((ulong64)(x))>>48)&255); \
151+
(y)[5] = (unsigned char)(((ulong64)(x))>>40)&255); (y)[4] = (unsigned char)((((ulong64)(x))>>32)&255); \
152+
(y)[3] = (unsigned char)(((ulong64)(x))>>24)&255); (y)[2] = (unsigned char)((((ulong64)(x))>>16)&255); \
153+
(y)[1] = (unsigned char)(((ulong64)(x))>>8)&255); (y)[0] = (unsigned char)(((ulong64)(x))&255); } while(0)
154154

155155
#define LOAD64L(x, y) \
156156
do { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
@@ -187,10 +187,10 @@ do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
187187
((ulong32)((y)[0] & 255)); } while(0)
188188

189189
#define STORE64L(x, y) \
190-
do { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
191-
(y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
192-
(y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
193-
(y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0)
190+
do { (y)[7] = (unsigned char)((((ulong64)(x))>>56)&255); (y)[6] = (unsigned char)((((ulong64)(x))>>48)&255); \
191+
(y)[5] = (unsigned char)((((ulong64)(x))>>40)&255); (y)[4] = (unsigned char)((((ulong64)(x))>>32)&255); \
192+
(y)[3] = (unsigned char)((((ulong64)(x))>>24)&255); (y)[2] = (unsigned char)((((ulong64)(x))>>16)&255); \
193+
(y)[1] = (unsigned char)((((ulong64)(x))>>8)&255); (y)[0] = (unsigned char)(((ulong64)(x))&255); } while(0)
194194

195195
#define LOAD64L(x, y) \
196196
do { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \
@@ -207,10 +207,10 @@ do { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \
207207
do { XMEMCPY(&(x), y, 4); } while(0)
208208

209209
#define STORE64H(x, y) \
210-
do { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
211-
(y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
212-
(y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
213-
(y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } while(0)
210+
do { (y)[0] = (unsigned char)(((ulong64)x)>>56)&255); (y)[1] = (unsigned char)(((ulong64)(x)>>48)&255); \
211+
(y)[2] = (unsigned char)(((ulong64)x)>>40)&255); (y)[3] = (unsigned char)(((ulong64)(x)>>32)&255); \
212+
(y)[4] = (unsigned char)(((ulong64)x)>>24)&255); (y)[5] = (unsigned char)(((ulong64)(x)>>16)&255); \
213+
(y)[6] = (unsigned char)(((ulong64)x)>>8)&255); (y)[7] = (unsigned char)((ulong64)(x)&255); } while(0)
214214

215215
#define LOAD64H(x, y) \
216216
do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \

0 commit comments

Comments
 (0)