diff options
author | Jack Lloyd <[email protected]> | 2016-07-15 14:37:37 -0400 |
---|---|---|
committer | Jack Lloyd <[email protected]> | 2016-07-15 14:37:37 -0400 |
commit | a24e9a6ca4e2bc68cf8fbc82b8d72d35c7f93a71 (patch) | |
tree | 32311454be7f312a74ab08443a899f614af2f74e /src/lib | |
parent | b3bc80dfdb28aee0900b6ed92dff5ba8c5e4daf9 (diff) |
Fix undefined behavior in donna128 type
Caused Curve25519 tests to fail when compiled by Clang on ARM, may have
affected other 32-bit platforms.
GH #532
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/utils/donna128.h | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/lib/utils/donna128.h b/src/lib/utils/donna128.h index c2a3e0d2e..2a2d1e339 100644 --- a/src/lib/utils/donna128.h +++ b/src/lib/utils/donna128.h @@ -23,18 +23,24 @@ class donna128 friend donna128 operator>>(const donna128& x, size_t shift) { donna128 z = x; - const u64bit carry = z.h << (64 - shift); - z.h = (z.h >> shift); - z.l = (z.l >> shift) | carry; + if(shift > 0) + { + const u64bit carry = z.h << (64 - shift); + z.h = (z.h >> shift); + z.l = (z.l >> shift) | carry; + } return z; } friend donna128 operator<<(const donna128& x, size_t shift) { donna128 z = x; - const u64bit carry = z.l >> (64 - shift); - z.l = (z.l << shift); - z.h = (z.h << shift) | carry; + if(shift > 0) + { + const u64bit carry = z.l >> (64 - shift); + z.l = (z.l << shift); + z.h = (z.h << shift) | carry; + } return z; } |