* asynchronous message sending to allow accepting messages when agent (or server) is offline
* send pending messages after agent restart; test for pending messages delivery when server restarted
* test pending message delivery after agent restart
* message delivery process per server
* test layout
* agent lock to avoid running subscriber and client processing in parallel; remove check that the connection is active when delivering a message
* use agent lock in agent functions
* commands to support introduction
* agent messages / envelopes to support introductions
* introductions and invitations table; insert record with random unique ID
* store class methods and types for introductions
* process INTRO and ACPT commands for connection introductions
* fix tests: add MonadFail constraint, remove OK response to JOIN
* process agent messages for introductions
* ICON notification when introduction is completed
* replace multiway if with case
* correction
* support random connection IDs
* save additional connection fields, refactor create connection funcs
* refactor
* refactor
* test duplex connection with random IDs
* store methods for introductions
* test introduction
* fix parsing of CON agent message
* test introduction with random connection IDs
* broadcast with random connection and broadcast IDs
* clean up sql
* sign and verify agent messages with key sent in HELLO (TODO: hardcoded block size - should use size from handshake; verify signature of HELLO message itself; possibly, different MSG status if signature was not verified (currently ignored) or failed to verify (currently fails with AGENT A_ENCRYPTION - alternatively, change it to AGENT A_SIGNATURE))
* remove hardcoded block size, make it 4096 bytes
* verify signature of HELLO message before it is added to RcvQueue
* refactor
* update doc
* rename functions
* inventory of error handling problems and types
* Change SMP protocol errors syntax
* connection errors in agent protocol (ERR CONN), STORE error -> AGENT error
* include exception in SEInternal error
* add MESSAGE errors, remove CRYPTO and SIZE errors
* agent protocol SYNTAX and AGENT errors
* BROKER errors
* group all client command (and agent response) errors
* BROKER TRANSPORT error
* simplify Client
* clean up
* transport errors
* simplify client
* parse / serialize agent errors
* differentiate crypto errors
* update errors.md
* make agent and SMP protocol errors consistent, simplify
* update doc
* test: parse / serialize protocol errors with QuickCheck
* add String to internal error
* exponential back-off when retrying to send HELLO
* refactor Client.hs
* replace fold with recursion in startTCPClient
* fail test if server did not start, refactor
* test: wait till TCP server stops
* test: refactor waiting for server to stop
* test: fail with error if server did not start/stop
* transport encryption (WIP - using fixed key, parsing/serialization works, SMP tests fail)
* transport encryption
* transport encryption: separate keys to receive and to send, counter-based IVs
* docs: update transport encryption and handshake
* transport encryption handshake (TODO: validate key hash, welcome block, move keys to system environment)
* change KeyHash type to newtype of Digest SHA256
* transport encryption: validate public key hash
* send and receive welcome block with SMP version
* refactor: parsing SMPServer
* remove unused function
* verify that client version is compatible with server version (major version is not smaller)
* update (fix) SMP server tests
* clrify encryption schemes
* increase SMP ping delay
* include authTag and msg size in encrypted message header, pad messages to fixed size
* use newtype for Key and IV bytestrings
* rename CryptoError constructors
* refactor Word to Int conversion
* refactor padding, replace padding character
* rfc corrections, comment
* rename aesTagSize -> authTagSize
* failing test
* use separate db connections for each TCP client connection
* refactor atomically, increast delay in tests
* increase test delay for SMP server to start
* increase SMP ping frequency
* remove comment
* separate SQLite connection per thread, to support multi-threaded mode
* remove redundant import
* generate key pair
* crypto: sign/verify functions
* remove extension
* parse/serialize keys
* use RSA recipient/sender keys (TODO sign/verify)
* make PublicKey newtype, assign 0s to private_p & private_q
* replace SMP command parsing with Attoparsec
* rename types: Signed->Transmission, Transmission->SignedTransmission
* sign and verify commands (server tests skipped, agent tests pass)
* SMP client: avoid seralizing transmission twice when sending commands
* update SMP server tests to use command signatures
* remove support for "SEND :msg" syntax from SMP server protocol
* rename RSA module name to R to avoid confusion with C used for S.M.Crypto
* update key sizes to use bits `div` 8
* tidy up
* kill TCP server client threads when the main server thread is killed; test END notification when server connection dies
* revert to using forkIO in the tests
* make subscriptions state change atomic
* remove commented out code
* Revert "revert to using forkIO in the tests"
This reverts commit c0bacd92e4.
* handle TCP disconnections (WIP)
* agent: handle SMP server disconnections
* agent: notify client about lost subscriptions when SMP server disconnects
* comments for testing functions
* remove test apps
* chore: reorder functions in Transport
* add comment
Co-authored-by: Efim Poberezkin <efim.poberezkin@gmail.com>