
2 changed files with 40 additions and 0 deletions
@ -0,0 +1,21 @@ |
|||||
|
// This file is under GNU General Public License 3.0
|
||||
|
// see LICENSE.txt
|
||||
|
|
||||
|
#include "constant_time_algo.hh" |
||||
|
|
||||
|
namespace pEp { |
||||
|
bool constant_time_equal(const std::string &a, const std::string &b) |
||||
|
{ |
||||
|
if (a.size() != b.size()) |
||||
|
return false; |
||||
|
|
||||
|
unsigned d = 0; |
||||
|
for (std::size_t idx = 0; idx < a.size(); ++idx) { |
||||
|
d |= (static_cast<unsigned>(a[idx]) ^ static_cast<unsigned>(b[idx])); |
||||
|
} |
||||
|
|
||||
|
// if d is still 0, the strings are equal.
|
||||
|
return d == 0; |
||||
|
} |
||||
|
|
||||
|
} // end of namespace pEp
|
@ -0,0 +1,19 @@ |
|||||
|
// This file is under GNU General Public License 3.0
|
||||
|
// see LICENSE.txt
|
||||
|
|
||||
|
#ifndef LIBPEPADAPTER_CONSTANT_TIME_ALGO_HH |
||||
|
#define LIBPEPADAPTER_CONSTANT_TIME_ALGO_HH |
||||
|
|
||||
|
#include <string> |
||||
|
|
||||
|
namespace pEp { |
||||
|
// Returns false if a.size() != b.size().
|
||||
|
// Compares always _all_ characters of 'a' and 'b' so runtime does not
|
||||
|
// depends on the character position where the strings differ.
|
||||
|
// Use this function instead of operator== if timing sidechannel attack
|
||||
|
// might be a security problem.
|
||||
|
bool constant_time_equal(const std::string &a, const std::string &b); |
||||
|
|
||||
|
} // end of namespace pEp
|
||||
|
|
||||
|
#endif // LIBPEPADAPTER_CONSTANT_TIME_ALGO_HH
|
Loading…
Reference in new issue