Fix GetField for stray CR or LF
The test vector rsa_pkcs1_1_5.txt is the torture test. We calculated an incorrect index when a line continuation was part of a commentpull/186/merge
parent
3f9667f3cd
commit
973de7712a
60
datatest.cpp
60
datatest.cpp
|
|
@ -656,6 +656,10 @@ void TestKeyDerivationFunction(TestData &v)
|
||||||
SignalTestFailure();
|
SignalTestFailure();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetField parses the name/value pairs. The tricky part is the insertion operator
|
||||||
|
// because Unix&Linux uses LF, OS X uses CR, and Windows uses CRLF. If this function
|
||||||
|
// is modified, then run 'cryptest.exe tv rsa_pkcs1_1_5' as a test. Its the parser
|
||||||
|
// file from hell. If it can be parsed without error, then things are likely OK.
|
||||||
bool GetField(std::istream &is, std::string &name, std::string &value)
|
bool GetField(std::istream &is, std::string &name, std::string &value)
|
||||||
{
|
{
|
||||||
// ***** Name *****
|
// ***** Name *****
|
||||||
|
|
@ -685,31 +689,59 @@ bool GetField(std::istream &is, std::string &name, std::string &value)
|
||||||
|
|
||||||
while (continueLine && std::getline(is, line))
|
while (continueLine && std::getline(is, line))
|
||||||
{
|
{
|
||||||
// Early out for immediately continuing a line
|
// Unix and Linux may have a stray \r because of Windows
|
||||||
if (!line.empty() && line[0] == '\\') { continue; }
|
if (!line.empty() && (line[line.size() - 1] == '\r' || line[line.size() - 1] == '\n')) {
|
||||||
|
line.erase(line.size()-1);
|
||||||
|
}
|
||||||
|
|
||||||
// Leading, trailing and temp position. The leading iterator moves right, and trailing
|
continueLine = false;
|
||||||
// iterator moves left. The sub-string in the middle is the value for the name. The
|
if (!line.empty())
|
||||||
// value can be an empty string. One Plaintext is often empty for algorithm testing.
|
{
|
||||||
|
// Early out for immediate line continuation
|
||||||
|
if (line[0] == '\\') {
|
||||||
|
continueLine = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Check end of line. It must be last character
|
||||||
|
if (line[line.size() - 1] == '\\') {
|
||||||
|
continueLine = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Leading, trailing and temp position. The leading position moves right, and
|
||||||
|
// trailing position moves left. The sub-string in the middle is the value for
|
||||||
|
// the name. We leave one space when line continuation is in effect, (and if
|
||||||
|
// present). The value can be an empty string. One Plaintext value is often
|
||||||
|
// empty for algorithm testing.
|
||||||
std::string::size_type l, t, p;
|
std::string::size_type l, t, p;
|
||||||
const std::string whitespace = " \r\n\t\v\f";
|
const std::string whitespace = " \r\n\t\v\f";
|
||||||
|
|
||||||
l = line.find_first_not_of(whitespace);
|
l = line.find_first_not_of(whitespace);
|
||||||
if (l == std::string::npos) { break; }
|
if (l == std::string::npos) { l = 0; }
|
||||||
t = line.find_last_not_of(whitespace);
|
t = line.find_last_not_of(whitespace+"\\");
|
||||||
|
if (l == std::string::npos) { t = line.size(); }
|
||||||
continueLine = false;
|
|
||||||
if (t != std::string::npos && line[t] == '\\') {
|
|
||||||
continueLine = true;
|
|
||||||
t = line.find_last_not_of(whitespace, t-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Chop comment. Perform after setting continueLine
|
||||||
p = line.find('#', l);
|
p = line.find('#', l);
|
||||||
if (p < t) {
|
if (p < t) {
|
||||||
t = p;
|
t = p;
|
||||||
t = line.find_last_not_of(whitespace, t-1);
|
if (t) t--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Leave one whitespace if line continuation is in effect
|
||||||
|
if (continueLine)
|
||||||
|
{
|
||||||
|
if (l > 0 && ::isspace(line[l - 1]))
|
||||||
|
{
|
||||||
|
l--;
|
||||||
|
}
|
||||||
|
else if (t < line.size()-1 && ::isspace(line[t + 1]))
|
||||||
|
{
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CRYPTOPP_ASSERT(t >= l);
|
||||||
value += line.substr(l, t - l + 1);
|
value += line.substr(l, t - l + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue