Rice Pastry API

org.mpisws.p2p.transport.rc4
Class RC4TransportLayer<Identifier,MsgType>

java.lang.Object
  extended by org.mpisws.p2p.transport.rc4.RC4TransportLayer<Identifier,MsgType>
Type Parameters:
Identifier -
MsgType -
All Implemented Interfaces:
TransportLayer<Identifier,MsgType>, TransportLayerCallback<Identifier,MsgType>, Destructable

public class RC4TransportLayer<Identifier,MsgType>
extends java.lang.Object
implements TransportLayer<Identifier,MsgType>, TransportLayerCallback<Identifier,MsgType>

Only encrypts socket traffic!!! Encrypts channels based on a password. Builds a session password for each socket which is a hash of the user-defined password and a clear-text seed. Note that the seed length isn't sent in the protocol, so it must be the same on all peers. Why do we need a password seed? Imagine a protocol where you contact a peer and it returns a boolean. W/O a seed, the protocol would only return 2 possible messages. While you may not know which is which, you could probably figure it out by seeing who returns what. Both sides need to have a different seed, so that under a simple agreement protocol, you can't easily see a replay. E.G: A -> B: 14 // I propose 14 B -> A: 14 // I agree to 14, in this case an evesdropper could determine whether or not B agreed with A, which is a leak of info Here's the Seed protocol we use: // pw is a pre-established password A -> B: SeedB B -> E(H(pw,SeedB))[SeedA,SeedB] // Now A and B each have an agreed upon seed // Note that it may be important in step 2 to send SeedA before SeedB, otherwise, an attacker could keep sending new SeedB, // and maybe learn something about the first packet... but maybe this doesn't matter because of the Hashing to generate the secret key

Author:
Jeff Hoye

Field Summary
protected  TransportLayerCallback<Identifier,MsgType> callback
           
protected  Environment env
           
protected  ErrorHandler<Identifier> errorHandler
           
static int KEY_LENGTH
           
protected  Logger logger
           
protected  java.security.MessageDigest md
           
protected  TransportLayer<Identifier,MsgType> tl
          Default 1 1 = encrypt 0 = don't encrypt Need to implemet this before we add it to the API
 
Constructor Summary
RC4TransportLayer(TransportLayer<Identifier,MsgType> tl, Environment env, java.lang.String password)
           
RC4TransportLayer(TransportLayer<Identifier,MsgType> tl, Environment env, java.lang.String password, int pwSeedLength, RandomSource random)
           
 
Method Summary
 void acceptMessages(boolean b)
          Toggle accepting incoming messages.
 void acceptSockets(boolean b)
          Toggle accepting new sockets.
 void destroy()
           
 Identifier getLocalIdentifier()
          The local node.
 void incomingSocket(P2PSocket<Identifier> s)
          Notification of a new socket.
 void messageReceived(Identifier i, MsgType m, java.util.Map<java.lang.String,java.lang.Object> options)
          Called when a new message is received.
 SocketRequestHandle<Identifier> openSocket(Identifier i, SocketCallback<Identifier> deliverSocketToMe, java.util.Map<java.lang.String,java.lang.Object> options)
          Open a socket to the Identifier
 MessageRequestHandle<Identifier,MsgType> sendMessage(Identifier i, MsgType m, MessageCallback<Identifier,MsgType> deliverAckToMe, java.util.Map<java.lang.String,java.lang.Object> options)
          Send the message to the identifier
 void setCallback(TransportLayerCallback<Identifier,MsgType> callback)
          Set the callback for incoming sockets/messages
 void setErrorHandler(ErrorHandler<Identifier> handler)
          To be notified of problems not related to an outgoing messaage/socket.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

tl

protected TransportLayer<Identifier,MsgType> tl
Default 1 1 = encrypt 0 = don't encrypt Need to implemet this before we add it to the API


callback

protected TransportLayerCallback<Identifier,MsgType> callback

env

protected Environment env

logger

protected Logger logger

errorHandler

protected ErrorHandler<Identifier> errorHandler

md

protected java.security.MessageDigest md

KEY_LENGTH

public static final int KEY_LENGTH
See Also:
Constant Field Values
Constructor Detail

RC4TransportLayer

public RC4TransportLayer(TransportLayer<Identifier,MsgType> tl,
                         Environment env,
                         java.lang.String password)
                  throws java.security.NoSuchAlgorithmException
Throws:
java.security.NoSuchAlgorithmException

RC4TransportLayer

public RC4TransportLayer(TransportLayer<Identifier,MsgType> tl,
                         Environment env,
                         java.lang.String password,
                         int pwSeedLength,
                         RandomSource random)
                  throws java.security.NoSuchAlgorithmException
Throws:
java.security.NoSuchAlgorithmException
Method Detail

acceptMessages

public void acceptMessages(boolean b)
Description copied from interface: TransportLayer
Toggle accepting incoming messages. Useful in flow control if overwhelmed by incoming sockets. Default: true

Specified by:
acceptMessages in interface TransportLayer<Identifier,MsgType>

acceptSockets

public void acceptSockets(boolean b)
Description copied from interface: TransportLayer
Toggle accepting new sockets. Useful in flow control if overwhelmed by incoming sockets. Default: true

Specified by:
acceptSockets in interface TransportLayer<Identifier,MsgType>

getLocalIdentifier

public Identifier getLocalIdentifier()
Description copied from interface: TransportLayer
The local node.

Specified by:
getLocalIdentifier in interface TransportLayer<Identifier,MsgType>
Returns:
The local node.

openSocket

public SocketRequestHandle<Identifier> openSocket(Identifier i,
                                                  SocketCallback<Identifier> deliverSocketToMe,
                                                  java.util.Map<java.lang.String,java.lang.Object> options)
Description copied from interface: TransportLayer
Open a socket to the Identifier

Specified by:
openSocket in interface TransportLayer<Identifier,MsgType>
Parameters:
i - who to open the socket to
deliverSocketToMe - the callback when the socket is opened
options - options on how to open the socket (don't source route, encrypt etc) (may not be respected if layer cannot provide service)
Returns:
an object to cancel opening the socket if it takes to long, or is no longer relevent

incomingSocket

public void incomingSocket(P2PSocket<Identifier> s)
                    throws java.io.IOException
Description copied from interface: TransportLayerCallback
Notification of a new socket.

Specified by:
incomingSocket in interface TransportLayerCallback<Identifier,MsgType>
Parameters:
s - the incoming socket
Throws:
java.io.IOException

sendMessage

public MessageRequestHandle<Identifier,MsgType> sendMessage(Identifier i,
                                                            MsgType m,
                                                            MessageCallback<Identifier,MsgType> deliverAckToMe,
                                                            java.util.Map<java.lang.String,java.lang.Object> options)
Description copied from interface: TransportLayer
Send the message to the identifier

Specified by:
sendMessage in interface TransportLayer<Identifier,MsgType>
Parameters:
i - the destination
m - the message
deliverAckToMe - layer dependent notification when the message is sent (can indicate placed on the wire, point-to-point acknowledgment, or end-to-end acknowledgement)
options - delivery options (don't source route, encrypt etc) (may not be respected if layer cannot provide service)
Returns:
ability to cancel the message if no longer relevant

setCallback

public void setCallback(TransportLayerCallback<Identifier,MsgType> callback)
Description copied from interface: TransportLayer
Set the callback for incoming sockets/messages

Specified by:
setCallback in interface TransportLayer<Identifier,MsgType>
Parameters:
callback - the callback for incoming sockets/messages

setErrorHandler

public void setErrorHandler(ErrorHandler<Identifier> handler)
Description copied from interface: TransportLayer
To be notified of problems not related to an outgoing messaage/socket. Or to be notified if a callback isn't provided.

Specified by:
setErrorHandler in interface TransportLayer<Identifier,MsgType>
Parameters:
handler - to be notified of problems not related to a specific messaage/socket.

destroy

public void destroy()
Specified by:
destroy in interface Destructable

messageReceived

public void messageReceived(Identifier i,
                            MsgType m,
                            java.util.Map<java.lang.String,java.lang.Object> options)
                     throws java.io.IOException
Description copied from interface: TransportLayerCallback
Called when a new message is received.

Specified by:
messageReceived in interface TransportLayerCallback<Identifier,MsgType>
Parameters:
i - The node it is coming from
m - the message
options - describe how the message arrived (udp/tcp, encrypted etc)
Throws:
java.io.IOException - if there is a problem decoding the message

Rice Pastry API

Copyright © 2001-2005 - Rice Pastry.