Skip to content

Commit 79ecd1f

Browse files
committed
ESIGN: use .data() to preserve bounds for Fortify/Clang; add defensive assert
Fortify/Clang emits false positive in InvertibleESIGNFunction::GenerateRandom because pointer arithmetic on SecByteBlock after implicit conversion to byte* loses destination object's size info. - Change seed + 4 to seed.data() + 4 to preserve bounds for static analyzers - Add CRYPTOPP_ASSERT to document invariant (compiles to no-op in release) - No behavior change: buffer is resized, then seedParam.size() bytes copied at offset +4 The .data() method avoids analyzer losing track of object size after pointer arithmetic. Assert documents intended invariant and helps static analysis tools.
1 parent 2e1e872 commit 79ecd1f

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

esign.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,11 @@ void InvertibleESIGNFunction::GenerateRandom(RandomNumberGenerator &rng, const N
115115
throw InvalidArgument("InvertibleESIGNFunction::GenerateRandom: buffer overflow");
116116

117117
seed.resize(seedParam.size() + 4);
118-
std::memcpy(seed + 4, seedParam.begin(), seedParam.size());
118+
// Defensive assertion for static analyzers; compiles to no-op in release builds
119+
CRYPTOPP_ASSERT(seed.size() >= seedParam.size() + 4);
120+
121+
// Use .data() so Fortify/Clang retain destination object bounds
122+
std::memcpy(seed.data() + 4, seedParam.begin(), seedParam.size());
119123

120124
PutWord(false, BIG_ENDIAN_ORDER, seed, (word32)0);
121125
m_p.GenerateRandom(rng, CombinedNameValuePairs(primeParam, MakeParameters("Seed", ConstByteArrayParameter(seed))));

0 commit comments

Comments
 (0)