29 #include <openssl/sha.h>
30 #include <openssl/rand.h>
31 #define RANDOM_NUMBER_LENGTH 256
37 HashProtocol::HashState::~HashState()
58 HashState &state = session.
getState<HashState>();
64 throw ibrcommon::Exception(
"Error while generating random number");
71 sha256(request, std::string(state.random.begin(), state.random.end()) + pkey.
getData());
79 HashState &state = session.
getState<HashState>();
88 const std::string data_str = data.str();
89 state.commitment = std::vector<char>(data_str.begin(), data_str.end());
95 throw ibrcommon::Exception(
"Error while generating random number");
108 const std::string data_str = data.str();
109 state.commitment = std::vector<char>(data_str.begin(), data_str.end());
139 std::string commitment = std::string(&state.commitment[0], 2*SHA256_DIGEST_LENGTH);
141 std::stringstream controlStream;
142 sha256(controlStream, r + pub);
143 if (commitment != controlStream.str())
145 throw ibrcommon::Exception(
"Error while comparing commitment");
160 response << rnd_data;
168 sha256(event, r + pub + random + pkey.
getData());
180 const std::string commitment = std::string(&state.commitment[0], 2*SHA256_DIGEST_LENGTH);
181 std::stringstream controlStream;
182 sha256(controlStream, r + pub);
184 if (commitment != controlStream.str())
186 throw ibrcommon::Exception(
"Error while comparing commitment");
192 const std::string random(state.random.begin(), state.random.end());
198 sha256(event, random + pkey.getData() + r + pub);
207 void HashProtocol::sha256(std::ostream &stream,
const std::string &data)
209 unsigned char hash[SHA256_DIGEST_LENGTH];
210 SHA256((
const unsigned char*) data.c_str(), data.size(), hash);
212 for(
int i = 0; i < SHA256_DIGEST_LENGTH; i++)
214 stream << std::hex << std::setw(2) << std::setfill(
'0') << (int)hash[i];
static SecurityKeyManager & getInstance()
virtual void begin(KeyExchangeSession &session, KeyExchangeData &data)
const dtn::data::EID & getPeer() const
static dtn::data::EID local
virtual KeyExchangeSession * createSession(const dtn::data::EID &peer, unsigned int uniqueId)
void putKey(const std::string &data, const dtn::security::SecurityKey::KeyType type, const dtn::security::SecurityKey::TrustLevel trust) const
virtual void step(KeyExchangeSession &session, KeyExchangeData &data)
virtual const std::string getData() const
#define RANDOM_NUMBER_LENGTH
dtn::security::SecurityKey get(const dtn::data::EID &ref, const dtn::security::SecurityKey::KeyType type=dtn::security::SecurityKey::KEY_UNSPEC) const
HashProtocol(KeyExchangeManager &manager)
virtual void submit(KeyExchangeSession &session, const KeyExchangeData &data)=0
KeyExchangeManager & manager
static void raise(const dtn::data::EID &eid, const dtn::security::KeyExchangeData &data)