
2 changed files with 33 additions and 0 deletions
@ -0,0 +1,19 @@ |
|||||
|
#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]) ); |
||||
|
} |
||||
|
|
||||
|
return d != 0; |
||||
|
} |
||||
|
|
||||
|
} // end of namespace pEp
|
@ -0,0 +1,14 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#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
|
Loading…
Reference in new issue