27 #include <ibrcommon/ssl/HMacStream.h>
29 #include <openssl/sha.h>
31 #define JPAKE_PRIME_LENGTH 1024
38 JPAKEProtocol::JPAKEState::JPAKEState()
43 JPAKEProtocol::JPAKEState::~JPAKEState()
45 if (ctx) JPAKE_CTX_free(ctx);
65 JPAKEState &state = session.
getState<JPAKEState>();
72 BN_hex2bn(&p,
"F9E5B365665EA7A05A9C534502780FEE6F1AB5BD4F49947FD036DBD7E905269AF46EF28B0FC07487EE4F5D20FB3C0AF8E700F3A2FA3414970CBED44FEDFF80CE78D800F184BB82435D137AADA2C6C16523247930A63B85661D1FC817A51ACD96168E95898A1F83A79FFB529368AA7833ABD1B0C3AEDDB14D2E1A2F71D99F763F");
78 const std::string password = data.str();
80 BIGNUM* secret = BN_new();
81 BN_bin2bn((
const unsigned char*)password.c_str(), (int)password.size(), secret);
89 JPAKE_STEP1_init(&send1);
90 JPAKE_STEP1_generate(&send1, state.ctx);
94 write(request, send1.p1.gx);
95 write(request, send1.p1.zkpx.gr);
96 write(request, send1.p1.zkpx.b);
97 write(request, send1.p2.gx);
98 write(request, send1.p2.zkpx.gr);
99 write(request, send1.p2.zkpx.b);
105 JPAKE_STEP1_release(&send1);
116 JPAKEState &state = session.
getState<JPAKEState>();
124 state.step1 = data.str();
132 std::stringstream step1(state.step1);
134 JPAKE_STEP1 received1;
135 JPAKE_STEP1_init(&received1);
136 read(step1, &received1.p1.gx);
137 read(step1, &received1.p1.zkpx.gr);
138 read(step1, &received1.p1.zkpx.b);
139 read(step1, &received1.p2.gx);
140 read(step1, &received1.p2.zkpx.gr);
141 read(step1, &received1.p2.zkpx.b);
143 BIGNUM* p = BN_new();
145 BIGNUM* q = BN_new();
147 BIGNUM* secret = BN_new();
148 BN_bin2bn((
const unsigned char*)data.str().c_str(), (int)data.str().size(), secret);
149 BIGNUM* g = BN_new();
154 if (!JPAKE_STEP1_process(state.ctx, &received1))
156 JPAKE_STEP1_release(&received1);
161 throw ibrcommon::Exception(
"Error while processing STEP1");
164 JPAKE_STEP1_release(&received1);
167 JPAKE_STEP1_init(&send1);
168 JPAKE_STEP1_generate(&send1, state.ctx);
173 write(response, send1.p1.gx);
174 write(response, send1.p1.zkpx.gr);
175 write(response, send1.p1.zkpx.b);
176 write(response, send1.p2.gx);
177 write(response, send1.p2.zkpx.gr);
178 write(response, send1.p2.zkpx.b);
182 JPAKE_STEP1_release(&send1);
200 JPAKE_STEP1 received1;
201 JPAKE_STEP1_init(&received1);
202 read(data, &received1.p1.gx);
203 read(data, &received1.p1.zkpx.gr);
204 read(data, &received1.p1.zkpx.b);
205 read(data, &received1.p2.gx);
206 read(data, &received1.p2.zkpx.gr);
207 read(data, &received1.p2.zkpx.b);
209 if (!JPAKE_STEP1_process(state.ctx, &received1))
211 JPAKE_STEP1_release(&received1);
212 throw ibrcommon::Exception(
"Error while processing STEP1");
215 JPAKE_STEP1_release(&received1);
218 JPAKE_STEP2_init(&send2);
219 JPAKE_STEP2_generate(&send2, state.ctx);
224 write(request, send2.gx);
225 write(request, send2.zkpx.gr);
226 write(request, send2.zkpx.b);
230 JPAKE_STEP2_release(&send2);
240 JPAKE_STEP2 received2;
241 JPAKE_STEP2_init(&received2);
242 read(data, &received2.gx);
243 read(data, &received2.zkpx.gr);
244 read(data, &received2.zkpx.b);
246 if (!JPAKE_STEP2_process(state.ctx, &received2))
248 JPAKE_STEP2_release(&received2);
249 throw ibrcommon::Exception(
"Error while processing STEP2");
252 JPAKE_STEP2_release(&received2);
255 JPAKE_STEP2_init(&send2);
256 JPAKE_STEP2_generate(&send2, state.ctx);
261 write(response, send2.gx);
262 write(response, send2.zkpx.gr);
263 write(response, send2.zkpx.b);
267 JPAKE_STEP2_release(&send2);
272 JPAKE_STEP2 received2;
273 JPAKE_STEP2_init(&received2);
274 read(data, &received2.gx);
275 read(data, &received2.zkpx.gr);
276 read(data, &received2.zkpx.b);
278 if (!JPAKE_STEP2_process(state.ctx, &received2))
280 JPAKE_STEP2_release(&received2);
281 throw ibrcommon::Exception(
"Error while processing STEP2");
284 JPAKE_STEP2_release(&received2);
287 JPAKE_STEP3A_init(&send3);
288 JPAKE_STEP3A_generate(&send3, state.ctx);
293 request.write((
char*) send3.hhk, SHA_DIGEST_LENGTH);
297 JPAKE_STEP3A_release(&send3);
307 JPAKE_STEP3A received3;
308 JPAKE_STEP3A_init(&received3);
309 data.read((
char*)&received3.hhk, SHA_DIGEST_LENGTH);
311 if (!JPAKE_STEP3A_process(state.ctx, &received3))
313 JPAKE_STEP3A_release(&received3);
314 throw ibrcommon::Exception(
"Error while processing STEP3A");
317 JPAKE_STEP3A_release(&received3);
320 JPAKE_STEP3B_init(&send3);
321 JPAKE_STEP3B_generate(&send3, state.ctx);
326 response.write((
char*) send3.hk, SHA_DIGEST_LENGTH);
330 JPAKE_STEP3B_release(&send3);
335 JPAKE_STEP3B received3;
336 JPAKE_STEP3B_init(&received3);
337 data.read((
char*)&received3.hk, SHA_DIGEST_LENGTH);
339 if (!JPAKE_STEP3B_process(state.ctx, &received3))
341 JPAKE_STEP3B_release(&received3);
342 throw ibrcommon::Exception(
"Error while processing STEP3B");
345 JPAKE_STEP3B_release(&received3);
347 std::stringstream secretBuf;
348 write(secretBuf, JPAKE_get_shared_key(state.ctx));
354 ibrcommon::HMacStream hstream((
unsigned char*) secretBuf.str().c_str(), (int) secretBuf.str().size());
355 hstream << publicKey << std::flush;
362 request << publicKey;
375 std::stringstream secretBuf;
376 write(secretBuf,JPAKE_get_shared_key(state.ctx));
383 ibrcommon::HMacStream hmacstream((
unsigned char*) secretBuf.str().c_str(), (int) secretBuf.str().size());
384 hmacstream << publicK << std::flush;
386 if (hmac != ibrcommon::HMacStream::extract(hmacstream))
388 throw ibrcommon::Exception(
"Error while comparing hmac");
398 ibrcommon::HMacStream hstream((
unsigned char*) secretBuf.str().c_str(), (int) secretBuf.str().size());
399 hstream << publicKey << std::flush;
405 response << publicKey;
415 std::stringstream secretBuf;
416 write(secretBuf, JPAKE_get_shared_key(state.ctx));
424 ibrcommon::HMacStream hstream((
unsigned char*) secretBuf.str().c_str(), (int) secretBuf.str().size());
425 hstream << publicK << std::flush;
427 if (hmac != ibrcommon::HMacStream::extract(hstream))
429 throw ibrcommon::Exception(
"Error while comparing hmac");
442 void JPAKEProtocol::write(std::ostream &stream,
const BIGNUM* bn)
444 unsigned char* buf =
new unsigned char[(BN_num_bits(bn) + 1) *
sizeof(
char)];
450 stream.write((
char*)buf, length.get<
size_t>());
456 throw ibrcommon::Exception(
"Error while parsing BIGNUM to string");
460 void JPAKEProtocol::read(std::istream &stream, BIGNUM **bn)
465 unsigned char* buf =
new unsigned char[length.get<
size_t>()];
466 stream.
read((
char*)buf, length.get<
size_t>());
467 *bn = BN_bin2bn((
unsigned char*)buf, (
int) length.get<
size_t>(), NULL);
472 throw ibrcommon::Exception(
"Error while parsing string to BIGNUM");
static SecurityKeyManager & getInstance()
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 const std::string getData() const
virtual void step(KeyExchangeSession &session, KeyExchangeData &data)
void read(std::istream &stream)
virtual void finish(KeyExchangeSession &session)=0
dtn::security::SecurityKey get(const dtn::data::EID &ref, const dtn::security::SecurityKey::KeyType type=dtn::security::SecurityKey::KEY_UNSPEC) const
virtual void submit(KeyExchangeSession &session, const KeyExchangeData &data)=0
static std::string toHex(const std::string &data)
virtual void begin(KeyExchangeSession &session, KeyExchangeData &data)
std::string getString() const
KeyExchangeManager & manager
JPAKEProtocol(KeyExchangeManager &manager)
static void raise(const dtn::data::EID &eid, const dtn::security::KeyExchangeData &data)