Fix ubsan 'left shift of negative value -1' error in satsub64be()
authorDavid Woodhouse <David.Woodhouse@intel.com>
Tue, 2 Aug 2016 21:54:46 +0000 (22:54 +0100)
committerMatt Caswell <matt@openssl.org>
Thu, 4 Aug 2016 19:56:24 +0000 (20:56 +0100)
commit2e94723c1b5d8ab974645e83de90b248265af3cd
treea5884ed0abd57521d97fb75f53e9675be9a82155
parent032924c4b4104654ff8659b4701e4ab25872a12e
Fix ubsan 'left shift of negative value -1' error in satsub64be()

Baroque, almost uncommented code triggers behaviour which is undefined
by the C standard. You might quite reasonably not care that the code was
broken on ones-complement machines, but if we support a ubsan build then
we need to at least pretend to care.

It looks like the special-case code for 64-bit big-endian is going to
behave differently (and wrongly) on wrap-around, because it treats the
values as signed. That seems wrong, and allows replay and other attacks.
Surely you need to renegotiate and start a new epoch rather than
wrapping around to sequence number zero again?

Reviewed-by: Rich Salz <rsalz@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
ssl/record/dtls1_bitmap.c