Commit Graph

225 Commits

Author SHA1 Message Date
akwizgran 2edb18aee0 Store outgoing connection numbers in the database. 2011-09-28 19:24:22 +01:00
akwizgran a8b96f11fd Added Consumer support to Writer, to avoid redundant copying. 2011-09-28 18:47:24 +01:00
akwizgran a1b664b639 More refactoring to connect ConnectionRecogniser to ConnectionReader.
Added TestDatabaseModule so tests can specify their own DB
configuration. The modules are currently too tightly coupled - see
whether any dependencies can be removed.
2011-09-28 14:21:38 +01:00
akwizgran 4aff0c4f88 Refactored transport component and renamed WritersModule.
The goal of the refactoring was to clean up the dependencies of
IncomingBatchConnection and OutgoingBatchConnection.
2011-09-27 19:21:44 +01:00
akwizgran 98ab523092 Database refactoring to fix injection problems. 2011-09-23 18:52:56 +01:00
akwizgran b470afb4ef Added DatabaseComponent.setSeen() for handling requests.
Also moved IO out of the lock in receiveOffer().
2011-09-23 16:06:14 +01:00
akwizgran 7c6e0c349c Extracted constants from DatabaseComponent interface. 2011-09-23 15:33:41 +01:00
akwizgran b675c38953 Don't do IO while holding database locks. 2011-09-23 12:55:23 +01:00
akwizgran 09971c8460 Implemented incoming and outgoing batch connections (untested). 2011-09-22 16:26:06 +01:00
akwizgran b65d6631f1 Removed writer's count of bytes written and renamed a method. 2011-09-21 18:22:14 +01:00
akwizgran eba6884281 Javadocs. 2011-09-21 18:09:56 +01:00
akwizgran 8dd7ec93e7 DatabaseComponent.generateAck() now returns a boolean.
The return value indicates whether any batch IDs were written.
AckWriter.finish() and Database.removeBatchesToAck() are only called
if at least one batch ID was written.
2011-09-21 17:51:17 +01:00
akwizgran 10c3b21726 Expose the encryption and authentication overhead without breaking
encapsulation.

This should allow callers to calculate maximum packet sizes without
knowing the details of the transport protocol.
2011-09-21 15:22:25 +01:00
akwizgran 7e58b25618 Allow the max packet length to be reduced from the default. 2011-09-21 13:47:06 +01:00
akwizgran 3e60233ae0 Expose serialisation overhead without breaking encapsulation. 2011-09-21 13:16:58 +01:00
akwizgran 95c3fb4fed Removed getCapacity() from BatchWriter interface. 2011-09-21 12:37:19 +01:00
akwizgran 7ac615520b Moved tag definitions inside serial component. 2011-09-21 12:08:27 +01:00
akwizgran 5548eb32cd DatabaseComponent.generateBatch() now returns a boolean.
This allows a connection to know whether to try writing another batch
immediately, or to wait for an event from the DB.
2011-09-20 14:45:07 +01:00
akwizgran 3dd3742a96 Folded findLostBatches() into receiveAck(). 2011-09-19 18:45:19 +01:00
akwizgran 005e7d5207 Added a random salt to prevent ID clashes between anonymous messages. 2011-09-13 17:56:44 +01:00
akwizgran de5caca578 Basic database support for private messages. 2011-09-13 14:43:48 +01:00
akwizgran 2858c139fa Make the group field of messages optional.
Private messages have no group.
2011-09-13 14:17:22 +01:00
akwizgran 1d25b5a92e Use null instead of MessageId.NONE and AuthorId.NONE, as for other
optional fields.
2011-09-13 14:04:23 +01:00
akwizgran 70b1487140 Renamed user-defined tags "user-defined type identifiers". 2011-09-12 16:32:25 +01:00
akwizgran fd2046d984 Renumbered object identifiers to reflect removal of OFFER_ID. 2011-09-12 16:23:55 +01:00
akwizgran 64548375cc Offer IDs no longer need to be calculated or echoed in requests.
The initiator flag in the transport protocol makes this unnecessary by
linking the two sides of a stream-mode connection, making it
impossible for an attacker to replay the responder's side of a
different connection.
2011-09-12 16:21:17 +01:00
akwizgran 7ed747b2a3 Added an initiator flag (bit 31) to the IV.
The flag is used to distinguish between the initiator and responder
directions of a stream-mode connection, allowing them to use the same
connection number without risking IV reuse.

The flag is also raised for batch-mode connections, which only have
one direction.
2011-09-07 17:21:52 +01:00
akwizgran 39be97a4d6 Order sendable messages by timestamp. Also fixed some comments. 2011-09-07 15:55:03 +01:00
akwizgran bbf957cc94 We can squeeze in a few more subscriptions. 2011-09-07 14:06:35 +01:00
akwizgran 331e7e0547 Increased the maximum packet size to 1 MiB.
This should provide acceptable memory usage and database locking
granularity, while making subscription and transport updates large
enough for the incremental update issue to be kicked into the long
grass.

Removed awareness of the serialisation format from the protocol
component wherever possible, and added tests to ensure that the
constants defined in the protocol package's API are compatible with
the serialisation format.
2011-09-07 13:51:30 +01:00
akwizgran 9dea4d0299 The word "tag" was overloaded, so from now on use "tag" for the
predefined tags in the protocol and serial components, and "IV" for
the encrypted IVs used to identify connections in the transport
component.
2011-08-19 11:15:35 +02:00
akwizgran 2411e2008b Frame the encrypted data independently of inter-packet boundaries and
authenticate each frame before parsing its contents. Each connection
starts with a tag, followed by any number of frames, each starting
with the frame number (32 bits) and payload length (16 bits), and
ending with a MAC (256 bits).

Tags have the following format: 32 bits reserved, 16 bits for the
transport ID, 32 bits for the connection number, 32 bits (set to zero
in the tag) for the frame number, and 16 bits (set to zero in the tag)
for the block number. The tag is encrypted with the tag key in
ECB mode.

Frame numbers for each connection must start from zero and must be
contiguous and strictly increasing. Each frame is encrypted with the
frame key in CTR mode, using the plaintext tag with the appropriate
frame number to initialise the counter.

The maximum frame size is 64 KiB, including header and footer. The
maximum amount of data that can be sent over a connection is 2^32
frames - roughly 2^48 bytes, or 8 terabytes, with the maximum frame
size of 64 KiB. If that isn't sufficient we can add another 16 bits to
the frame counter.
2011-08-19 01:46:51 +02:00
akwizgran 4dd303d9e1 Changed maximum packet and message sizes in preparation for new
transport format.
2011-08-18 15:14:48 +02:00
akwizgran 5e0aadd373 Moved the subscription and transport timestamps out of the contacts
table so it's not necessary to hold a write lock on the (heavily used)
contacts table to update them.
2011-08-14 14:46:12 +02:00
akwizgran 2c13e35dc4 Calculate the timestamp outside the subscription/transport update
writer - this will allow it to be saved so new connections can work
out whether they should send updates.
2011-08-14 13:36:21 +02:00
akwizgran 4497774311 Derive separate keys for each direction. 2011-08-14 12:18:16 +02:00
akwizgran 254da2da27 Removed the restriction that transport updates have to be written in
delimited form.
2011-08-14 11:41:56 +02:00
akwizgran c2b0f0ab5a Each request packet should contain the unique ID of the offer to which
it responds.
2011-08-13 17:46:19 +02:00
akwizgran 9d25a819d1 Decoupled ProtocolReader (which belongs in the protocol component)
from PacketReader (which belongs in the transport component).
2011-08-13 14:18:16 +02:00
akwizgran 5b6fecfb43 Updated FileReadWriteTest to use the transport component for
encrypting and decrypting packets. Moved the test to the main package
since it's an integration test for several components.
2011-08-12 23:24:24 +02:00
akwizgran 0504a2d6fd Implemented PacketReader, renamed Packet{Reader,Writer}Factory in the
protocol component to Protocol{Reader,Writer}Factory.
2011-08-12 21:55:22 +02:00
akwizgran 68b4760dfa Use a constant for the tag size. 2011-08-12 14:26:56 +02:00
akwizgran 7545a1cc8f Moved Bytes to the main package. Added a SharedSecret class to parse
encrypted secrets retrieved from the database.
2011-08-11 19:14:20 +01:00
akwizgran df972e294d Support for decrypting shared secrets and deriving authentication and
encryption keys from them (untested).
2011-08-11 17:15:36 +01:00
akwizgran 3edfa5d1ba Call the listeners when contacts are added and removed. 2011-08-11 15:55:30 +01:00
akwizgran 151a360587 Store shared secrets in the database (the crypto component will be
responsible for wrapping/unwrapping them).
2011-08-11 15:41:52 +01:00
akwizgran 07b34cfbab Added a lock for the connectionWindows table and exposed
getConnectionWindow() and setConnectionWindow() through the
DatabaseComponent interface.
2011-08-11 15:19:32 +01:00
akwizgran 0e6638bad6 Retrieve the set of unseen connection numbers from a connection
window.
2011-08-11 13:58:11 +01:00
akwizgran e0b86f1232 Moved ConnectionWindow into the transport module and implemented
window sliding (untested).
2011-08-11 13:22:23 +01:00
akwizgran d5d03192e3 Basic connection window persistence. 2011-08-11 12:56:21 +01:00