This is a header-only C++14 library implementing custom transport encryption using libsodium and Asio's stackless coroutines. It assumes pre-shared public keys and uses only the sealed box and crypto box constructs.
This library depends on Asio, libsodium, Microsoft's Guideline Support Library, and the reference implementation for std::experimental::optional. Aside from libsodium, these dependencies are bundled as submodules in the bundle directory. To use this library, just add the appropriate bundled include directories to your project along with the primary include directory. You will also need to install and link against libsodium.
The included CMakeLists.txt specifies an interface for the
library, which should make things easier for cmake users. Note that if you'd
like to use your own copies of the dependencies, the
OPTIONAL_LOCATION cache variables are available.
For a usage example, see the socket test. Note that this library only supports in-order transports (e.g. tcp or domain sockets).
Running the Tests
git clone --recursive git://github.com/mikezackles/asio_sodium_socket && cd asio_sodium_socket cmake . && make && ctest
Using the server's public key, the client sends a fixed-length sealed box containing the client's public key and a random reply nonce. If the public key retrieved from the sealed box is unknown, the connection is terminated.
The server uses the reply nonce to respond with a crypto box containing a reply nonce and a followup nonce. The reply nonce is used for the client's next transmission, and the followup nonce is used for the server's next transmission.
Subsequent messages consist of a fixed-length message header followed by variable-length message data. A message header contains the length of the following message data along with the random data nonce used to encrypt the message data and a random followup nonce that will be used to encrypt the next message header. The message length is sent in little-endian format.