Fix undefined behaviour in shifts.
authorEmilia Kasper <emilia@openssl.org>
Sat, 14 Mar 2015 04:10:13 +0000 (21:10 -0700)
committerEmilia Kasper <emilia@openssl.org>
Sat, 14 Mar 2015 04:14:20 +0000 (21:14 -0700)
commitbe109b9eec79a90871e5deb7d6ede8c04f073884
tree0154ef1cf189c64a79fd38b1cc915979e39358c2
parentc0d69ddb3323e45afba7a7f1608fb03f9a7d6fff
Fix undefined behaviour in shifts.

Td4 and Te4 are arrays of u8. A u8 << int promotes the u8 to an int first then shifts.
If the mathematical result of a shift (as modelled by lhs * 2^{rhs}) is not representable
in an integer, behaviour is undefined. In other words, you can't shift into the sign bit
of a signed integer. Fix this by casting to u32 whenever we're shifting left by 24.

(For consistency, cast other shifts, too.)

Caught by -fsanitize=shift

Submitted by Nick Lewycky (Google)

Reviewed-by: Andy Polyakov <appro@openssl.org>
(cherry picked from commit 8b37e5c14f0eddb10c7f91ef91004622d90ef361)
crypto/aes/aes_core.c
crypto/aes/aes_x86core.c