* make KeyHash non-optional, StrEncoding class
* change server URI format in agent config, refactor with StrEncoding
* refactor Crypto using checkAlgorithm
* refactor parsing connection requests
* prepare to validate CA fingerprint sent in client handshake
* KeyHash check in handshake
* rename type to CliCommand
* server validates keyhash sent by the client
* validate -a option when parsing
* more of StrEncoding
* binary SMP protocol encoding (server tests fail)
* use 1 byte for bytestring length when encoding/decoding
* Encoding class, binary tags
* update server tests
* negotiate SMP version in client/server handshake
* add version columns to queues and connections
* split parsing SMP client commands and server responses to different functions
* check uniqueness of protocol tags
* split client commands and server responses/messages to separate types
* update types in SMP client
* remove pattern synonyms for SMP errors
* simplify getHandshake
* update SMP protocol encoding in protocol spec
* encode time as a number of seconds (64-bit integer) since epoch
* 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
* 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
* agent: send CON to user when the 1st party responds HELLO; fix REPLY vulnerability
* test for getRcvConn
* add commented OK response to JOIN command
* store: use Only newtype to select one field
* 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
* key encoding primitives (WIP)
* use X509/PKCS8 to read/write server key files
* make PrivateKey type class
* clean up
* remove separate public key file
* specific import
* 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
* 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