Fix Clang 5.0 "runtime error: addition of unsigned offset to 0xXXXX overflowed to 0xYYYY" (GH #549)

This commit is contained in:
Jeffrey Walton 2017-12-16 18:18:53 -05:00
parent dc21de2483
commit 19deccf3ba
No known key found for this signature in database
GPG Key ID: B36AB348921B1838
3 changed files with 69 additions and 58 deletions

View File

@ -24,6 +24,7 @@
#include "config.h" #include "config.h"
#include "misc.h" #include "misc.h"
#include "stdcpp.h"
#if (CRYPTOPP_ARM_NEON_AVAILABLE) #if (CRYPTOPP_ARM_NEON_AVAILABLE)
# include <arm_neon.h> # include <arm_neon.h>
@ -88,18 +89,18 @@ inline size_t AdvancedProcessBlocks64_NEON2x6(F2 func2, F6 func6,
CRYPTOPP_ASSERT(outBlocks); CRYPTOPP_ASSERT(outBlocks);
CRYPTOPP_ASSERT(length >= 8); CRYPTOPP_ASSERT(length >= 8);
const size_t blockSize = 8; const ptrdiff_t blockSize = 8;
const size_t neonBlockSize = 16; const ptrdiff_t neonBlockSize = 16;
size_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : neonBlockSize; ptrdiff_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : neonBlockSize;
size_t xorIncrement = xorBlocks ? neonBlockSize : 0; ptrdiff_t xorIncrement = xorBlocks ? neonBlockSize : 0;
size_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : neonBlockSize; ptrdiff_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : neonBlockSize;
if (flags & BT_ReverseDirection) if (flags & BT_ReverseDirection)
{ {
inBlocks += length - neonBlockSize; inBlocks += static_cast<ptrdiff_t>(length) - neonBlockSize;
xorBlocks += length - neonBlockSize; xorBlocks += static_cast<ptrdiff_t>(length) - neonBlockSize;
outBlocks += length - neonBlockSize; outBlocks += static_cast<ptrdiff_t>(length) - neonBlockSize;
inIncrement = 0-inIncrement; inIncrement = 0-inIncrement;
xorIncrement = 0-xorIncrement; xorIncrement = 0-xorIncrement;
outIncrement = 0-outIncrement; outIncrement = 0-outIncrement;
@ -316,18 +317,18 @@ size_t AdvancedProcessBlocks128_NEON1x6(F1 func1, F6 func6,
CRYPTOPP_ASSERT(outBlocks); CRYPTOPP_ASSERT(outBlocks);
CRYPTOPP_ASSERT(length >= 16); CRYPTOPP_ASSERT(length >= 16);
const size_t blockSize = 16; const ptrdiff_t blockSize = 16;
// const size_t neonBlockSize = 16; // const ptrdiff_t neonBlockSize = 16;
size_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize; ptrdiff_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize;
size_t xorIncrement = xorBlocks ? blockSize : 0; ptrdiff_t xorIncrement = xorBlocks ? blockSize : 0;
size_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize; ptrdiff_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize;
if (flags & BT_ReverseDirection) if (flags & BT_ReverseDirection)
{ {
inBlocks += length - blockSize; inBlocks += static_cast<ptrdiff_t>(length) - blockSize;
xorBlocks += length - blockSize; xorBlocks += static_cast<ptrdiff_t>(length) - blockSize;
outBlocks += length - blockSize; outBlocks += static_cast<ptrdiff_t>(length) - blockSize;
inIncrement = 0-inIncrement; inIncrement = 0-inIncrement;
xorIncrement = 0-xorIncrement; xorIncrement = 0-xorIncrement;
outIncrement = 0-outIncrement; outIncrement = 0-outIncrement;
@ -455,18 +456,18 @@ size_t AdvancedProcessBlocks128_NEON2x6(F2 func2, F6 func6,
CRYPTOPP_ASSERT(outBlocks); CRYPTOPP_ASSERT(outBlocks);
CRYPTOPP_ASSERT(length >= 16); CRYPTOPP_ASSERT(length >= 16);
const size_t blockSize = 16; const ptrdiff_t blockSize = 16;
// const size_t neonBlockSize = 16; // const ptrdiff_t neonBlockSize = 16;
size_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize; ptrdiff_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize;
size_t xorIncrement = xorBlocks ? blockSize : 0; ptrdiff_t xorIncrement = xorBlocks ? blockSize : 0;
size_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize; ptrdiff_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize;
if (flags & BT_ReverseDirection) if (flags & BT_ReverseDirection)
{ {
inBlocks += length - blockSize; inBlocks += static_cast<ptrdiff_t>(length) - blockSize;
xorBlocks += length - blockSize; xorBlocks += static_cast<ptrdiff_t>(length) - blockSize;
outBlocks += length - blockSize; outBlocks += static_cast<ptrdiff_t>(length) - blockSize;
inIncrement = 0-inIncrement; inIncrement = 0-inIncrement;
xorIncrement = 0-xorIncrement; xorIncrement = 0-xorIncrement;
outIncrement = 0-outIncrement; outIncrement = 0-outIncrement;
@ -682,18 +683,18 @@ inline size_t AdvancedProcessBlocks64_SSE2x6(F2 func2, F6 func6,
CRYPTOPP_ASSERT(outBlocks); CRYPTOPP_ASSERT(outBlocks);
CRYPTOPP_ASSERT(length >= 8); CRYPTOPP_ASSERT(length >= 8);
const size_t blockSize = 8; const ptrdiff_t blockSize = 8;
const size_t xmmBlockSize = 16; const ptrdiff_t xmmBlockSize = 16;
size_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : xmmBlockSize; ptrdiff_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : xmmBlockSize;
size_t xorIncrement = xorBlocks ? xmmBlockSize : 0; ptrdiff_t xorIncrement = xorBlocks ? xmmBlockSize : 0;
size_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : xmmBlockSize; ptrdiff_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : xmmBlockSize;
if (flags & BT_ReverseDirection) if (flags & BT_ReverseDirection)
{ {
inBlocks += length - xmmBlockSize; inBlocks += static_cast<ptrdiff_t>(length) - xmmBlockSize;
xorBlocks += length - xmmBlockSize; xorBlocks += static_cast<ptrdiff_t>(length) - xmmBlockSize;
outBlocks += length - xmmBlockSize; outBlocks += static_cast<ptrdiff_t>(length) - xmmBlockSize;
inIncrement = 0-inIncrement; inIncrement = 0-inIncrement;
xorIncrement = 0-xorIncrement; xorIncrement = 0-xorIncrement;
outIncrement = 0-outIncrement; outIncrement = 0-outIncrement;
@ -916,18 +917,18 @@ inline size_t AdvancedProcessBlocks128_SSE2x6(F2 func2, F6 func6,
CRYPTOPP_ASSERT(outBlocks); CRYPTOPP_ASSERT(outBlocks);
CRYPTOPP_ASSERT(length >= 16); CRYPTOPP_ASSERT(length >= 16);
const size_t blockSize = 16; const ptrdiff_t blockSize = 16;
// const size_t xmmBlockSize = 16; // const ptrdiff_t xmmBlockSize = 16;
size_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize; ptrdiff_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize;
size_t xorIncrement = xorBlocks ? blockSize : 0; ptrdiff_t xorIncrement = xorBlocks ? blockSize : 0;
size_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize; ptrdiff_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize;
if (flags & BT_ReverseDirection) if (flags & BT_ReverseDirection)
{ {
inBlocks += length - blockSize; inBlocks += static_cast<ptrdiff_t>(length) - blockSize;
xorBlocks += length - blockSize; xorBlocks += static_cast<ptrdiff_t>(length) - blockSize;
outBlocks += length - blockSize; outBlocks += static_cast<ptrdiff_t>(length) - blockSize;
inIncrement = 0-inIncrement; inIncrement = 0-inIncrement;
xorIncrement = 0-xorIncrement; xorIncrement = 0-xorIncrement;
outIncrement = 0-outIncrement; outIncrement = 0-outIncrement;
@ -1101,18 +1102,18 @@ inline size_t AdvancedProcessBlocks128_SSE1x4(F1 func1, F4 func4,
CRYPTOPP_ASSERT(outBlocks); CRYPTOPP_ASSERT(outBlocks);
CRYPTOPP_ASSERT(length >= 16); CRYPTOPP_ASSERT(length >= 16);
const size_t blockSize = 16; const ptrdiff_t blockSize = 16;
// const size_t xmmBlockSize = 16; // const ptrdiff_t xmmBlockSize = 16;
size_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize; ptrdiff_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize;
size_t xorIncrement = xorBlocks ? blockSize : 0; ptrdiff_t xorIncrement = xorBlocks ? blockSize : 0;
size_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize; ptrdiff_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize;
if (flags & BT_ReverseDirection) if (flags & BT_ReverseDirection)
{ {
inBlocks += length - blockSize; inBlocks += static_cast<ptrdiff_t>(length) - blockSize;
xorBlocks += length - blockSize; xorBlocks += static_cast<ptrdiff_t>(length) - blockSize;
outBlocks += length - blockSize; outBlocks += static_cast<ptrdiff_t>(length) - blockSize;
inIncrement = 0-inIncrement; inIncrement = 0-inIncrement;
xorIncrement = 0-xorIncrement; xorIncrement = 0-xorIncrement;
outIncrement = 0-outIncrement; outIncrement = 0-outIncrement;

View File

@ -26,6 +26,7 @@
#include "osrng.h" #include "osrng.h"
#include "secblock.h" #include "secblock.h"
#include "smartptr.h" #include "smartptr.h"
#include "stdcpp.h"
// http://www.cygwin.com/faq.html#faq.api.winsock // http://www.cygwin.com/faq.html#faq.api.winsock
#if (defined(__CYGWIN__) || defined(__CYGWIN32__)) && defined(PREFER_WINDOWS_STYLE_SOCKETS) #if (defined(__CYGWIN__) || defined(__CYGWIN32__)) && defined(PREFER_WINDOWS_STYLE_SOCKETS)
@ -147,14 +148,13 @@ size_t BlockTransformation::AdvancedProcessBlocks(const byte *inBlocks, const by
CRYPTOPP_ASSERT(outBlocks); CRYPTOPP_ASSERT(outBlocks);
CRYPTOPP_ASSERT(length); CRYPTOPP_ASSERT(length);
size_t blockSize = BlockSize(); ptrdiff_t blockSize = static_cast<ptrdiff_t>(BlockSize());
size_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize; ptrdiff_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize;
size_t xorIncrement = xorBlocks ? blockSize : 0; ptrdiff_t xorIncrement = xorBlocks ? blockSize : 0;
size_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize; ptrdiff_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize;
if (flags & BT_ReverseDirection) if (flags & BT_ReverseDirection)
{ {
CRYPTOPP_ASSERT(length % blockSize == 0);
inBlocks += length - blockSize; inBlocks += length - blockSize;
xorBlocks += length - blockSize; xorBlocks += length - blockSize;
outBlocks += length - blockSize; outBlocks += length - blockSize;
@ -164,7 +164,7 @@ size_t BlockTransformation::AdvancedProcessBlocks(const byte *inBlocks, const by
} }
// Coverity finding. // Coverity finding.
bool xorFlag = xorBlocks && (flags & BT_XorInput); const bool xorFlag = xorBlocks && (flags & BT_XorInput);
while (length >= blockSize) while (length >= blockSize)
{ {
if (xorFlag) if (xorFlag)
@ -181,6 +181,7 @@ size_t BlockTransformation::AdvancedProcessBlocks(const byte *inBlocks, const by
if (flags & BT_InBlockIsCounter) if (flags & BT_InBlockIsCounter)
const_cast<byte *>(inBlocks)[blockSize-1]++; const_cast<byte *>(inBlocks)[blockSize-1]++;
inBlocks += inIncrement; inBlocks += inIncrement;
outBlocks += outIncrement; outBlocks += outIncrement;
xorBlocks += xorIncrement; xorBlocks += xorIncrement;

View File

@ -3,14 +3,18 @@
#include "pch.h" #include "pch.h"
#include "seed.h" #include "seed.h"
#include "misc.h" #include "misc.h"
#include "stdcpp.h"
NAMESPACE_BEGIN(CryptoPP) ANONYMOUS_NAMESPACE_BEGIN
static const word32 s_kc[16] = { using CryptoPP::byte;
using CryptoPP::word32;
const word32 s_kc[16] = {
0x9e3779b9, 0x3c6ef373, 0x78dde6e6, 0xf1bbcdcc, 0xe3779b99, 0xc6ef3733, 0x8dde6e67, 0x1bbcdccf, 0x9e3779b9, 0x3c6ef373, 0x78dde6e6, 0xf1bbcdcc, 0xe3779b99, 0xc6ef3733, 0x8dde6e67, 0x1bbcdccf,
0x3779b99e, 0x6ef3733c, 0xdde6e678, 0xbbcdccf1, 0x779b99e3, 0xef3733c6, 0xde6e678d, 0xbcdccf1b}; 0x3779b99e, 0x6ef3733c, 0xdde6e678, 0xbbcdccf1, 0x779b99e3, 0xef3733c6, 0xde6e678d, 0xbcdccf1b};
static const byte s_s0[256] = { const byte s_s0[256] = {
0xA9, 0x85, 0xD6, 0xD3, 0x54, 0x1D, 0xAC, 0x25, 0x5D, 0x43, 0x18, 0x1E, 0x51, 0xFC, 0xCA, 0x63, 0x28, 0xA9, 0x85, 0xD6, 0xD3, 0x54, 0x1D, 0xAC, 0x25, 0x5D, 0x43, 0x18, 0x1E, 0x51, 0xFC, 0xCA, 0x63, 0x28,
0x44, 0x20, 0x9D, 0xE0, 0xE2, 0xC8, 0x17, 0xA5, 0x8F, 0x03, 0x7B, 0xBB, 0x13, 0xD2, 0xEE, 0x70, 0x8C, 0x44, 0x20, 0x9D, 0xE0, 0xE2, 0xC8, 0x17, 0xA5, 0x8F, 0x03, 0x7B, 0xBB, 0x13, 0xD2, 0xEE, 0x70, 0x8C,
0x3F, 0xA8, 0x32, 0xDD, 0xF6, 0x74, 0xEC, 0x95, 0x0B, 0x57, 0x5C, 0x5B, 0xBD, 0x01, 0x24, 0x1C, 0x73, 0x3F, 0xA8, 0x32, 0xDD, 0xF6, 0x74, 0xEC, 0x95, 0x0B, 0x57, 0x5C, 0x5B, 0xBD, 0x01, 0x24, 0x1C, 0x73,
@ -52,6 +56,10 @@ static const byte s_s1[256] = {
#define SS3(x) ((s_s1[x]*0x01010101UL) & 0xCFF3FC3F) #define SS3(x) ((s_s1[x]*0x01010101UL) & 0xCFF3FC3F)
#define G(x) (SS0(GETBYTE(x, 0)) ^ SS1(GETBYTE(x, 1)) ^ SS2(GETBYTE(x, 2)) ^ SS3(GETBYTE(x, 3))) #define G(x) (SS0(GETBYTE(x, 0)) ^ SS1(GETBYTE(x, 1)) ^ SS2(GETBYTE(x, 2)) ^ SS3(GETBYTE(x, 3)))
ANONYMOUS_NAMESPACE_END
NAMESPACE_BEGIN(CryptoPP)
void SEED::Base::UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs& /*params*/) void SEED::Base::UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs& /*params*/)
{ {
AssertValidKeyLength(length); AssertValidKeyLength(length);
@ -60,7 +68,8 @@ void SEED::Base::UncheckedSetKey(const byte *userKey, unsigned int length, const
GetBlock<word64, BigEndian> get(userKey); GetBlock<word64, BigEndian> get(userKey);
get(key01)(key23); get(key01)(key23);
word32 *k = m_k; word32 *k = m_k;
size_t kInc = 2; ptrdiff_t kInc = 2;
if (!IsForwardTransformation()) if (!IsForwardTransformation())
{ {
k = k+30; k = k+30;