net.i2p.router.transport.ntcp
Class EstablishState

java.lang.Object
  extended by net.i2p.router.transport.ntcp.EstablishState

public class EstablishState
extends java.lang.Object

Handle the 4-phase establishment, which is as follows:


 Alice                   contacts                      Bob
 =========================================================

 Message 1 (Session Request):
  X+(H(X) xor Bob.identHash)----------------------------->

 Message 2 (Session Created):
  <----------------------------------------Y+E(H(X+Y)+tsB, sk, Y[239:255])

 Message 3 (Session Confirm A):
  E(sz+Alice.identity+tsA+padding+S(X+Y+Bob.identHash+tsA+tsB), sk, hX_xor_Bob.identHash[16:31])--->

 Message 4 (Session Confirm B):
  <----------------------E(S(X+Y+Alice.identHash+tsA+tsB)+padding, sk, prev)

  Key:

    X, Y: 256 byte DH keys
    H(): 32 byte SHA256 Hash
    E(data, session key, IV): AES256 Encrypt
    S(): 40 byte DSA Signature
    tsA, tsB: timestamps (4 bytes, seconds since epoch)
    sk: 32 byte Session key
    sz: 2 byte size of Alice identity to follow

 
Alternately, when Bob receives a connection, it could be a check connection (perhaps prompted by Bob asking for someone to verify his listener). check connections are formatted per isCheckInfo() NOTE: Check info is unused.


Constructor Summary
EstablishState(RouterContext ctx, NTCPTransport transport, NTCPConnection con)
           
 
Method Summary
 boolean confirmWritten()
          we have written all of the data required to confirm the connection establishment
 java.lang.String getError()
           
 java.lang.Exception getException()
           
 byte[] getExtraBytes()
          if complete, this will contain any bytes received as part of the handshake that were after the actual handshake.
 boolean getFailedBySkew()
           
 boolean isComplete()
           
 boolean isCorrupt()
          did the handshake fail for some reason?
 void prepareOutbound()
          We are Alice.
 void receive(java.nio.ByteBuffer src)
          parse the contents of the buffer as part of the handshake.
 java.lang.String toString()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

EstablishState

public EstablishState(RouterContext ctx,
                      NTCPTransport transport,
                      NTCPConnection con)
Method Detail

receive

public void receive(java.nio.ByteBuffer src)
parse the contents of the buffer as part of the handshake. if the handshake is completed and there is more data remaining, the buffer is updated so that the next read will be the (still encrypted) remaining data (available from getExtraBytes)


confirmWritten

public boolean confirmWritten()
we have written all of the data required to confirm the connection establishment


getFailedBySkew

public boolean getFailedBySkew()

isCorrupt

public boolean isCorrupt()
did the handshake fail for some reason?


isComplete

public boolean isComplete()
Returns:
is the handshake complete and valid?

prepareOutbound

public void prepareOutbound()
We are Alice. We are establishing an outbound connection, so prepare ourselves by queueing up the write of the first part of the handshake This method sends message #1 to Bob.


getExtraBytes

public byte[] getExtraBytes()
if complete, this will contain any bytes received as part of the handshake that were after the actual handshake. This may return null.


getError

public java.lang.String getError()

getException

public java.lang.Exception getException()

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object