diff --git a/router/java/src/net/i2p/router/transport/udp/ACKBitfield.java b/router/java/src/net/i2p/router/transport/udp/ACKBitfield.java index f0201c4e8a9398c076f2884e84ada1baadffe264..c8b7c96309e414a9b14954f1bf090fd3e3b5aa19 100644 --- a/router/java/src/net/i2p/router/transport/udp/ACKBitfield.java +++ b/router/java/src/net/i2p/router/transport/udp/ACKBitfield.java @@ -4,7 +4,7 @@ package net.i2p.router.transport.udp; * Generic means of SACK/NACK transmission for partially or fully * received messages */ -public interface ACKBitfield { +interface ACKBitfield { /** what message is this partially ACKing? */ public long getMessageId(); /** how many fragments are covered in this bitfield? */ diff --git a/router/java/src/net/i2p/router/transport/udp/ACKSender.java b/router/java/src/net/i2p/router/transport/udp/ACKSender.java index 180232d6f24046c835b6fd0ab82f5c0c3099dfba..d6035766db1410fbf757b842ce3e52ce6bca2b02 100644 --- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java +++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java @@ -15,7 +15,7 @@ import net.i2p.util.Log; * any outstanding ACKs. * */ -public class ACKSender implements Runnable { +class ACKSender implements Runnable { private RouterContext _context; private Log _log; private UDPTransport _transport; diff --git a/router/java/src/net/i2p/router/transport/udp/DummyThrottle.java b/router/java/src/net/i2p/router/transport/udp/DummyThrottle.java index 383f807c5965eba299b1a2fa970ea2c919f428ca..d2cb73934cca7533353949eda435bfdd217319ab 100644 --- a/router/java/src/net/i2p/router/transport/udp/DummyThrottle.java +++ b/router/java/src/net/i2p/router/transport/udp/DummyThrottle.java @@ -14,7 +14,7 @@ import net.i2p.router.OutNetMessage; * * @since 0.7.12 */ -public class DummyThrottle implements OutboundMessageFragments.ActiveThrottle { +class DummyThrottle implements OutboundMessageFragments.ActiveThrottle { public DummyThrottle() { } diff --git a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java index 2e1fea71f4816e6ee86b23b7da9d92b6e955b3ca..275c200c2af420d186dfa08d64e0525da1180944 100644 --- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java +++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java @@ -33,7 +33,7 @@ import net.i2p.util.SimpleTimer; * as well as to drop any failed establishment attempts. * */ -public class EstablishmentManager { +class EstablishmentManager { private final RouterContext _context; private final Log _log; private final UDPTransport _transport; diff --git a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java index 829f62ee00321d6656ccfacfb78e4691c961d79b..6f4f5398098a457f33a3839c7e2546901cc4acd2 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java @@ -20,7 +20,7 @@ import net.i2p.util.Log; * we are Bob. * */ -public class InboundEstablishState { +class InboundEstablishState { private final RouterContext _context; private final Log _log; // SessionRequest message diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java index ddd44b1436c4852a60b249adb7890442c7824e93..bc0ddc5f5e1fdc0fabec9c8a0d520028b05e2617 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java @@ -17,7 +17,7 @@ import net.i2p.util.Log; * basic line of defense here). * */ -public class InboundMessageFragments /*implements UDPTransport.PartialACKSource */{ +class InboundMessageFragments /*implements UDPTransport.PartialACKSource */{ private RouterContext _context; private Log _log; /** list of message IDs recently received, so we can ignore in flight dups */ diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java index 3159cad8734bbd4a4d3c126ceae7678d7e4df99b..9261dc70a383a681fbb236fdd59da2808169fe85 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java @@ -11,7 +11,7 @@ import net.i2p.util.Log; * Hold the raw data fragments of an inbound message * */ -public class InboundMessageState { +class InboundMessageState { private RouterContext _context; private Log _log; private long _messageId; diff --git a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java index 6a2707f6080d1683f359d3d97de4fdc7bf19da95..c59668866b31a66ae145c5c8496b36aee86f931f 100644 --- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java +++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java @@ -20,7 +20,7 @@ import net.i2p.util.Log; /** * */ -public class IntroductionManager { +class IntroductionManager { private RouterContext _context; private Log _log; private UDPTransport _transport; diff --git a/router/java/src/net/i2p/router/transport/udp/MessageQueue.java b/router/java/src/net/i2p/router/transport/udp/MessageQueue.java index cc38ebbafec279bca630c800643bc32c2177e144..3d51055ca87a4da76f8d8e0679282285a1db8309 100644 --- a/router/java/src/net/i2p/router/transport/udp/MessageQueue.java +++ b/router/java/src/net/i2p/router/transport/udp/MessageQueue.java @@ -5,7 +5,7 @@ import net.i2p.router.OutNetMessage; /** * Base queue for messages not yet packetized */ -public interface MessageQueue { +interface MessageQueue { /** * Get the next message, blocking until one is found or the expiration * reached. diff --git a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java index 1a95c227fe6d42a29cfc3bf61a6f04e150692980..08b6088c4ffbd01295121adbed5559037ca30ca9 100644 --- a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java +++ b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java @@ -19,7 +19,7 @@ import net.i2p.util.Log; * parse 'em into I2NPMessages, and stick them on the * {@link net.i2p.router.InNetMessagePool} by way of the {@link UDPTransport}. */ -public class MessageReceiver { +class MessageReceiver { private RouterContext _context; private Log _log; private UDPTransport _transport; diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java index 6e3738f306d117fec298375bdbcbf93f415526c8..1e23a210c5bf33dad9ee794006eafa23512a534f 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java @@ -21,7 +21,7 @@ import net.i2p.util.Log; * they are Bob. * */ -public class OutboundEstablishState { +class OutboundEstablishState { private final RouterContext _context; private final Log _log; // SessionRequest message diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java index 2d4f272929e9e098433f131799b854cbe66f8b64..e25ab036915dcb28ccd19d7a26e59ef62d4dcb24 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java @@ -22,7 +22,7 @@ import net.i2p.util.Log; * message. * */ -public class OutboundMessageFragments { +class OutboundMessageFragments { private RouterContext _context; private Log _log; private UDPTransport _transport; diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java index 877ad10b174ab43c7591ec1856c8c906d383e5e2..a545cfb06258d7a3e2a4bb9e8d48015f8c708335 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java @@ -15,7 +15,7 @@ import net.i2p.util.Log; * Maintain the outbound fragmentation for resending * */ -public class OutboundMessageState { +class OutboundMessageState { private I2PAppContext _context; private Log _log; /** may be null if we are part of the establishment */ diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java b/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java index 841588ee4548491c2eb1551d79d2c3a3523f82a4..078105a4a7b1c00a471c9c758167879cdd1c7f37 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java @@ -12,7 +12,7 @@ import net.i2p.util.Log; * WARNING - UNUSED since 0.6.1.11 * */ -public class OutboundRefiller implements Runnable { +class OutboundRefiller implements Runnable { private RouterContext _context; private Log _log; private OutboundMessageFragments _fragments; diff --git a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java index c0d9e22f3f5e55a3e502380cbc02e234e6210953..672744444e23eca495ce4f8cadbfba35b19ebeed 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java @@ -22,8 +22,80 @@ import net.i2p.util.Log; * Big ol' class to do all our packet formatting. The UDPPackets generated are * fully authenticated, encrypted, and configured for delivery to the peer. * + * The following is from udp.html on the website: + +<p> +All UDP datagrams begin with a 16 byte MAC (Message Authentication Code) +and a 16 byte IV (Initialization Vector +followed by a variable +size payload encrypted with the appropriate key. The MAC used is +HMAC-MD5, truncated to 16 bytes, while the key is a full 32 byte AES256 +key. The specific construct of the MAC is the first 16 bytes from:</p> +<pre> + HMAC-MD5(payload || IV || (payloadLength ^ protocolVersion), macKey) +</pre> + +<p>The protocol version is currently 0.</p> + +<p>The payload itself is AES256/CBC encrypted with the IV and the +sessionKey, with replay prevention addressed within its body, +explained below. The payloadLength in the MAC is a 2 byte unsigned +integer in 2s complement.</p> + +<p>The protocolVersion is a 2 byte unsigned integer in 2s complement, +and currently set to 0. Peers using a different protocol version will +not be able to communicate with this peer, though earlier versions not +using this flag are.</p> + +<h2><a name="payload">Payload</a></h2> + +<p>Within the AES encrypted payload, there is a minimal common structure +to the various messages - a one byte flag and a four byte sending +timestamp (*seconds* since the unix epoch). The flag byte contains +the following bitfields:</p> +<pre> + bits 0-3: payload type + bit 4: rekey? + bit 5: extended options included + bits 6-7: reserved +</pre> + +<p>If the rekey flag is set, 64 bytes of keying material follow the +timestamp. If the extended options flag is set, a one byte option +size value is appended to, followed by that many extended option +bytes, which are currently uninterpreted.</p> + +<p>When rekeying, the first 32 bytes of the keying material is fed +into a SHA256 to produce the new MAC key, and the next 32 bytes are +fed into a SHA256 to produce the new session key, though the keys are +not immediately used. The other side should also reply with the +rekey flag set and that same keying material. Once both sides have +sent and received those values, the new keys should be used and the +previous keys discarded. It may be useful to keep the old keys +around briefly, to address packet loss and reordering.</p> + +<p>NOTE: Rekeying is currently unimplemented.</p> + +<pre> + Header: 37+ bytes + +----+----+----+----+----+----+----+----+ + | MAC | + | | + +----+----+----+----+----+----+----+----+ + | IV | + | | + +----+----+----+----+----+----+----+----+ + |flag| time | (optionally | + +----+----+----+----+----+ | + | this may have 64 byte keying material | + | and/or a one+N byte extended options) | + +---------------------------------------| +</pre> + + * + * */ -public class PacketBuilder { +class PacketBuilder { private I2PAppContext _context; private Log _log; private UDPTransport _transport; @@ -62,10 +134,16 @@ public class PacketBuilder { _context.statManager().createRateStat("udp.packetAuthTimeSlow", "How long it takes to encrypt and MAC a packet for sending (when its slow)", "udp", UDPTransport.RATES); } +/**** public UDPPacket buildPacket(OutboundMessageState state, int fragment, PeerState peer) { return buildPacket(state, fragment, peer, null, null); } +****/ + /** + * This builds a data packet (PAYLOAD_TYPE_DATA). + * See the methods below for the other message types. + * * @param ackIdsRemaining list of messageIds (Long) that should be acked by this packet. * The list itself is passed by reference, and if a messageId is * transmitted and the sender does not want the ID to be included @@ -231,8 +309,10 @@ public class PacketBuilder { return packet; } - // We use this for keepalive purposes. - // It doesn't generate a reply, but that's ok. + /** + * We use this for keepalive purposes. + * It doesn't generate a reply, but that's ok. + */ public UDPPacket buildPing(PeerState peer) { return buildACK(peer, Collections.EMPTY_LIST); } @@ -1018,6 +1098,9 @@ public class PacketBuilder { return packet; } + /** + * Sends an empty unauthenticated packet for hole punching + */ public UDPPacket buildHolePunch(UDPPacketReader reader) { UDPPacket packet = UDPPacket.acquire(_context, false); byte data[] = packet.getPacket().getData(); @@ -1051,7 +1134,7 @@ public class PacketBuilder { return packet; } - private void setTo(UDPPacket packet, InetAddress ip, int port) { + private static void setTo(UDPPacket packet, InetAddress ip, int port) { packet.getPacket().setAddress(ip); packet.getPacket().setPort(port); } diff --git a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java index 1a35c5d195741dc298b0f73968848080d86d285e..15dc164578eb016bf0dcf193a6ee8716a627f5a5 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java @@ -19,7 +19,7 @@ import net.i2p.util.Log; * receiver's queue and pushing them as necessary. * */ -public class PacketHandler { +class PacketHandler { private RouterContext _context; private Log _log; private UDPTransport _transport; @@ -525,6 +525,10 @@ public class PacketHandler { _establisher.receiveRelayResponse(from, reader); _context.statManager().addRateData("udp.receivePacketSize.relayResponse", packet.getPacket().getLength(), packet.getLifetime()); break; + case UDPPacket.PAYLOAD_TYPE_SESSION_DESTROY: + _state = 53; + //_TODO + break; default: _state = 52; if (_log.shouldLog(Log.WARN)) diff --git a/router/java/src/net/i2p/router/transport/udp/PacketPusher.java b/router/java/src/net/i2p/router/transport/udp/PacketPusher.java index 271e83597c3435af227841eb072ac02067c48ba1..50b8d3ba780b50ce6035aa0e08d047e69b791ca1 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketPusher.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketPusher.java @@ -9,7 +9,7 @@ import net.i2p.util.Log; * pool and toss 'em onto the outbound packet queue * */ -public class PacketPusher implements Runnable { +class PacketPusher implements Runnable { // private RouterContext _context; private Log _log; private OutboundMessageFragments _fragments; diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java index 65fb1c0147caea54f2ea5300b29c108ce957967e..6c1dec3e4563de374ca5cb820c437fe98e0d6886 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java @@ -23,7 +23,7 @@ import net.i2p.util.ConcurrentHashSet; * Contain all of the state about a UDP connection to a peer. * */ -public class PeerState { +class PeerState { private RouterContext _context; private Log _log; /** diff --git a/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java b/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java index acd0bd0b532dde527703d37d13e99e25ca5d0844..9721f22cce5ec39bf6f58ab83fcfeebe5d7e2030 100644 --- a/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java +++ b/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java @@ -20,7 +20,7 @@ import net.i2p.util.Log; * See comments in DQAT.java and mtn history ca. 2006-02-19 * */ -public class TimedWeightedPriorityMessageQueue implements MessageQueue, OutboundMessageFragments.ActiveThrottle { +class TimedWeightedPriorityMessageQueue implements MessageQueue, OutboundMessageFragments.ActiveThrottle { private RouterContext _context; private Log _log; /** FIFO queue of messages in a particular priority */ diff --git a/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java b/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java index ac9369d8eb7a059a7cf314d44c1bafece9d3e55c..fc2426700e5e52ba00832b75ee34615268544b82 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java @@ -11,7 +11,7 @@ import net.i2p.util.Log; * Coordinate the low level datagram socket, managing the UDPSender and * UDPReceiver */ -public class UDPEndpoint { +class UDPEndpoint { private RouterContext _context; private Log _log; private int _listenPort; diff --git a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java index 5dc001e18f0efad6d5c77f138a19618960c27975..1548e6036f547d018fa64c193ef812b2081922d5 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java @@ -16,7 +16,7 @@ import net.i2p.util.Log; * of object instances to allow rapid reuse. * */ -public class UDPPacket { +class UDPPacket { private I2PAppContext _context; private static Log _log; private volatile DatagramPacket _packet; @@ -63,6 +63,8 @@ public class UDPPacket { public static final int PAYLOAD_TYPE_RELAY_INTRO = 5; public static final int PAYLOAD_TYPE_DATA = 6; public static final int PAYLOAD_TYPE_TEST = 7; + /** @since 0.8.1 */ + public static final int PAYLOAD_TYPE_SESSION_DESTROY = 8; // various flag fields for use in the data packets public static final byte DATA_FLAG_EXPLICIT_ACK = (byte)(1 << 7); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java index 395a2fcf0e6a560c026d3902837667c158f4c0a6..0b65b2d47e7bc259ad3bf2c2c9a8f94dfbfa1e2a 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java @@ -15,7 +15,7 @@ import net.i2p.util.Log; * elements, grab the appropriate subreader. * */ -public class UDPPacketReader { +class UDPPacketReader { private I2PAppContext _context; private Log _log; private byte _message[]; @@ -125,6 +125,8 @@ public class UDPPacketReader { return "Relay request packet"; case UDPPacket.PAYLOAD_TYPE_RELAY_RESPONSE: return "Relay response packet"; + case UDPPacket.PAYLOAD_TYPE_SESSION_DESTROY: + return "Session destroyed packet"; default: return "Other packet type..."; } @@ -135,6 +137,8 @@ public class UDPPacketReader { buf.append(Base64.encode(_message, _payloadBeginOffset, _payloadLength)); } + /* ------- Begin Reader Classes ------- */ + /** Help read the SessionRequest payload */ public class SessionRequestReader { public static final int X_LENGTH = 256; @@ -747,6 +751,7 @@ public class UDPPacketReader { } } + /* ------- End Reader Classes ------- */ public static void main(String args[]) { I2PAppContext ctx = I2PAppContext.getGlobalContext(); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java index 88cb207791269b7c3b2784f797cb20ea7f6c7b80..0a1937db10d8c7c59e9c21da37b49536e6e7a563 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java @@ -19,7 +19,7 @@ import net.i2p.util.SimpleTimer; * from the queue ASAP by a {@link PacketHandler} * */ -public class UDPReceiver { +class UDPReceiver { private RouterContext _context; private Log _log; private DatagramSocket _socket; diff --git a/router/java/src/net/i2p/router/transport/udp/UDPSender.java b/router/java/src/net/i2p/router/transport/udp/UDPSender.java index 745b50df4b57b35ae11686cdc2048e782b9cb91e..01d10ed1c5c17e4b6019fcc358a6c9c6f70219c5 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPSender.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPSender.java @@ -15,7 +15,7 @@ import net.i2p.util.Log; * Lowest level packet sender, pushes anything on its queue ASAP. * */ -public class UDPSender { +class UDPSender { private RouterContext _context; private Log _log; private DatagramSocket _socket;