public boolean authenticate(AuthToken token, Message msg) { Address sender=msg.getSrc(); // 1. send a challenge to the sender byte[] buf=generateRandomBytes(challenge_size); Message challenge=new Message(sender).setFlag(Message.Flag.OOB) .putHeader(ID, new ChallengeResponseHeader(buf)); Entry entry=new Entry(buf); pending_requests.put(sender, entry); // here we'd have to check if a latch already exists... log.trace("%s: sending challenge to %s", auth.getAddress(), sender); try { auth.getDownProtocol().down(challenge); long hash=entry.future.get(block_time, TimeUnit.MILLISECONDS); boolean result=hash > 0 && hash == hash(encrypt(entry.challenge)); log.trace("%s: authentication of %s: %b (hash=%d)", auth.getAddress(), sender, result, hash); return result; } catch(Exception e) { return false; } finally { pending_requests.remove(sender); } }
public boolean authenticate(AuthToken token, Message msg) { Address sender=msg.getSrc(); // 1. send a challenge to the sender byte[] buf=generateRandomBytes(challenge_size); Message challenge=new Message(sender).setFlag(Message.Flag.OOB) .putHeader(ID, new ChallengeResponseHeader(buf)); Entry entry=new Entry(buf); pending_requests.put(sender, entry); // here we'd have to check if a latch already exists... log.trace("%s: sending challenge to %s", auth.getAddress(), sender); try { auth.getDownProtocol().down(challenge); long hash=entry.future.get(block_time, TimeUnit.MILLISECONDS); boolean result=hash > 0 && hash == hash(encrypt(entry.challenge)); log.trace("%s: authentication of %s: %b (hash=%d)", auth.getAddress(), sender, result, hash); return result; } catch(Exception e) { return false; } finally { pending_requests.remove(sender); } }
public boolean handleUpMessage(Message msg) { ChallengeResponseHeader hdr=msg.getHeader(ID); if(hdr == null) return true; switch(hdr.type) { case ChallengeResponseHeader.CHALLENGE: long hash=hash(encrypt(hdr.payload)); Message response=new Message(msg.getSrc()).setFlag(Message.Flag.OOB) .putHeader(ID, new ChallengeResponseHeader(hash)); log.trace("%s: received CHALLENGE from %s; sending RESPONSE (hash=%d)", auth.getAddress(), msg.src(), hash); auth.getDownProtocol().down(response); break; case ChallengeResponseHeader.RESPONSE: log.trace("%s: received RESPONSE from %s", auth.getAddress(), msg.getSrc()); Entry entry=pending_requests.get(msg.getSrc()); if(entry != null) entry.setResponse(hdr.hash); break; } return false; // don't pass up }
public boolean handleUpMessage(Message msg) { ChallengeResponseHeader hdr=msg.getHeader(ID); if(hdr == null) return true; switch(hdr.type) { case ChallengeResponseHeader.CHALLENGE: long hash=hash(encrypt(hdr.payload)); Message response=new Message(msg.getSrc()).setFlag(Message.Flag.OOB) .putHeader(ID, new ChallengeResponseHeader(hash)); log.trace("%s: received CHALLENGE from %s; sending RESPONSE (hash=%d)", auth.getAddress(), msg.src(), hash); auth.getDownProtocol().down(response); break; case ChallengeResponseHeader.RESPONSE: log.trace("%s: received RESPONSE from %s", auth.getAddress(), msg.getSrc()); Entry entry=pending_requests.get(msg.getSrc()); if(entry != null) entry.setResponse(hdr.hash); break; } return false; // don't pass up }