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, ErrorHandler<Identifier> errorHandler)
           
RC4TransportLayer(TransportLayer<Identifier,MsgType> tl, Environment env, java.lang.String password, int pwSeedLength, RandomSource random, ErrorHandler<Identifier> errorHandler)
           
 
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,
                         ErrorHandler<Identifier> errorHandler)
                  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,
                         ErrorHandler<Identifier> errorHandler)
                  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 relevant

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.


Imprint-Dataprotection