Changes in release 1.0.29:
* use the new EVP_MAC API in OpenSSL v3.0 for faster message digests.
* moved all buffers used by mdf_message_send() from mdf_t to mdf_message_t,
  the only really shared stuff is now the encryption variables.
* rearranged the structs for better cache utilization
* made mdf_t smaller
* small internal spinlock in necessary places which should make it possible
  to call mdf_message_send() simultanious from different threads as long as they
  all use their own local message_t structure.
* New functions:
 - mdf_message_add2() : like mdf_message_add() but the delay of
   the message can be set directly.
 - mdf_get_message_ptr() : for internal Millistream usage.
* New properties:
 - MDF_OPT_CONNECTED_HOST: returns the hostname of the currently connected server.
 - MDF_OPT_CONNECTED_IP: returns the ip address of the currently connected server.
* added defines for the various delay values
* changed the default delay to MDF_DLY_BEST
* support Aria and Camellia as encryption algorithms if available
  in used version of OpenSSL.
* support blake2s and blake2b as message digests.
* removed the TCP_QUICKACK code from v1.0.25 since it didn't imrove anything.

Changes in release 1.0.28:
* fixed autodetect of libzstd on systems without pkg-config
* mdf_consume() could stall if mdf_get_next_message2() hadn't
  been called until it returned false, aka if the consume buffer
  contained a handled message that wasn't marked as being consumed
  in full due to the changes on v1.0.27

Changes in release 1.0.27:
* Support strings compressed with zstd
* changed how the size of the read buffer is increased in response to 
  the widening of the tcp/ip window.
* small optimization in mdf_get_next_message2()
* New functions:
 - mdf_extract() : extracts the current message from the mdf handle.
 - mdf_inject() : injects a previously extracted message to the mdf handle.
* New properties:
 - MDF_OPT_RBUF_SIZE : returns the number of bytes waiting to be processed in
   the internaly read buffer after a call to mdf_consume().
 - MDF_OPT_RBUF_MAXSIZE : returns or sets the current size of the internal
   read buffer.

Changes in release 1.0.26:
* optimized mdf_message_send()
* mdf_message_send() will now bulk send multiple messages at once.
* moved the sendbuffer used by mdf_message_send() from mdf_t to mdf_message_t
* mdf_message_move() will now keep the old insref if both src and dst is UINT64_MAX
* slightly smaller memory footprint of the mdf_t and mdf_message_t structs
* check for available ciphers and digest by asking OpenSSL instead
  of using the presence of header files.
* load ciphers and digests by name instead of using the hardcoded
  EVP_xxx() functions.
* Support for OpenSSL v3.0
* now only disable SIGPIPE if we don't have MSG_NOSIGNAL or SO_NOSIGPIPE
  which basically means that this now only happens on Solaris.
* New properties:
 - MDF_OPT_TIMEOUT: returns how long to wait in number of seconds for action
   before having to call mdf_consume().
 - MDF_OPT_HANDLE_DELAY : enables delay-mode on the connection.
* New functions:
 - mdf_message_get_num_fields() : returns the number of fields in the current
   message.
 - mdf_get_mclass() : returns the message class of the current received 
   message.
 - mdf_get_next_message2() : new version of mdf_get_next_message() since
   the mclass no longer fits in a int32_t.
 - mdf_get_delay() : returns the intended delay of the current received
   message.
 - mdf_message_set_property() : replaces mdf_message_set_utf8_validation()
   and mdf_message_set_compression_level().

Changes in release 1.0.25:
* rekey on sent number of bytes and not only on sent number of messages
* support Chacha20 as encryption algorithm if available in used version of OpenSSL
* support SM4 as encryption algorithm if available in used version of OpenSSL
* support SHA3-224, SHA3-256, SHA3-384 and SHA3-512 as message digests
* support SM3 as message digest
* set TCP_QUICKACK on Linux to disable the delayed TCP/IP ACK
* New properties:
 - MDF_OPT_CRYPT_DIGESTS: the supported message digests used to authenticate
   messages between the server and the client. Can be set to limit the digests
   offered by the client to the server upon connect.
 - MDF_OPT_CRYPT_CIPHERS: the supported ciphers used to encrypt messages
   between the server and the client. Can be set to limit the ciphers offered
   by the client to the server upon connect.
 - MDF_OPT_CRYPT_DIGEST: returns the digest chosen by the server.
 - MDF_OPT_CRYPT_CIPHER: returns the cipher chosen by the server.

Changes in release 1.0.24:
* fixed a problem where decoding the feed templates could fail on the last
* mref due to a too short safety limit was used.
* mdf_message_add_time() will now accept up to nanoseconds resolution
* removed the soft limit of 1048510 bytes for strings accepted by mdf_message_add_string()
* update MDF_OPT_TIME_DIFFERENCE from the server heartbeat requests
* New Status Codes for the Status Callback Function:
 - MDF_STATUS_SND_HB_REQ : Sent a Heartbeat Request to the server.
 - MDF_STATUS_RCV_HB_REQ : Received a Heartbeat Request from the server.
 - MDF_STATUS_RCV_HB_RES : Received a Heartbeat Response from the server.
* New properties:
 - MDF_OPT_TIME_DIFFERENCE_NS: the time difference in number of nanoseconds
   between the client and the server. The value should be added to the
   current time on the client in order to get the server time. Please
   note that this can be a negative value if the local clock is ahead
   of the server clock!

Changes in release 1.0.23:
* fixed a small memory leak in mdf_connect()
* mdf_message_add() aprox 100% faster for cold calls
* mdf_message_add_list() aprox 10% faster
* decoding of nanosecond timestamps are aprox 13% faster
* small optimization in mdf_get_next_field()
* use the OpenSSL EVP functions for encryption and message digests
  so that we can utilize e.g AES-NI instructions in the CPU if
  available.
* New functions:
 - mdf_message_set_utf8_validation() : allows the user to disable
   the UTF8 validation performed in mdf_message_add_string() and
   mdf_message_add_string2() functions.
 - mdf_message_add_string2() : allows users to add strings to
   a MDF message with a predetermined length (handy in case the
   source string is not zero terminated or if only a subset of the
   string is to be added).

Changes in release 1.0.22:
* if 'timeout' to mdf_consume() is negative then the timeout is
  treated as being in microseconds.
* New functions:
 - mdf_message_set_compression_level() : allows the user to set which
   ZLIB compression level is used when libmdf is compressing strings
   added with the mdf_message_add_string() function for callers that
   want to enable higher compression for non-latency sensitive applications
* New properties:
 - MDF_OPT_BIND_ADDRESS: a client can now supply a IPv4 or IPv6 address
   to bind to before MDF connects to the server. The address must be in
   numerical form and is copied so the string can be thrown away after
   the call to mdf_set_property(). Call with NULL for value to 'unset'.
* Only call mdf_get_next_fields() inside mdf_get_next_message() if it's
  called on an unprocessed MDF_M_MESSAGESREFERENCE since this is the
  only message that we really must process.

Changes in release 1.0.21:
* Support for our small compression of the MDF_F_MMT field, since it's
  transferred as a normal string older versions can receive it just fine
  but then they will see the deflated version.
* Compress strings with BestSpeed instead of BestCompression since the size
  difference is insignificant while the speed difference is huge.
* Performance of mdf_get_next_field() increased again by replacing the 
  internal number-to-string function with a new more optimized one.
* Silenced alot of compiler warnings.
* Make libmdf compile under macOS, FreeBSD and Solaris

Changes in release 1.0.20:
* Support for LibreSSL
* Support for OpenSSL v1.1.0+
* New Functions:
 - mdf_message_move() : renames messages from one insref to 
   another or moves messages for a specific insref between
   mdf_message_t:s (and also possible change insref).
 - mdf_message_serialize() : serializes the message chain
   and produces a base64 encoded string.
 - mdf_message_deserialize() : reads a base64 encoded string
   and recreates the message chain from it.

Changes in release 1.0.19:
* Fix in mdf_consume() and mdf_message_send() so that they
  return false if they are called before the handshake with
  the server is complete.
* New Status Code for the Status Callback Function:
 - MDF_STATUS_READYTOLOGON : signals that the handshake with
   the server is complete and the client can send the logon
   message.
* Fix in mdf_message_add_time() where milliseconds could
  be encoded wrongly, i.e ".1", ".01" and ".001" would all
  be seen as 1msec and not as the correct 100, 10 and 1.
* New function:
 - mdf_message_add_time3() : like mdf_message_add_time2()
   but with nanoseconds instead of milliseconds.
* Support message callbacks that return before all
  received/queued messages have been handled.

Changes in release 1.0.18:
* Fix encoding numerics for 10741.80 and 10741.90
* support nanoseconds in time format #3
* New Function:
 - mdf_message_add_date2() : allows clients to add
   dates to a MDF message without having to convert
   them to strings first.
* Renamed src/byteswap.h to src/mdf_byteswap.h so
  <byteswap.h> can be included (on systems that have it)

Changes in release 1.0.17:
* New function:
 - mdf_message_add_int() : allows clients to add scaled
   signed integers to a MDF message without having to
   convert them to strings first.

Changes in release 1.0.16:
* fixed a small memory leak in mdf_destroy()
* enable sending of milliseconds in time format #3
* fixed build on Solaris
* removed various cppcheck warnings
* New function:
 - mdf_message_add_time2() : allows clients to add
   timestamps to a MDF message without having to
   convert them to strings first.

Changes in release 1.0.15:
* support the new RSA signature scheme where the server
  key is no longer static but sent upon connect, signed
  with the master key. Also gives us the opportunity to
  validate the hostname of the server and to set an 
  expiry date on the server key.

Changes in release 1.0.14:
* the new compact sending was reading 4 bytes outside
  it's allocated memory block if the tag could not
  be found in the template.
* support milliseconds in time format #3

Changes in release 1.0.13:
* mdf_message_send() will now compact messages according
  to the templates before sending, this will utilize much
  less bandwidth. Since the message send buffer is now
  recreated on each call to mdf_message_send() it is now
  possible to send the same message over and over, 
  previously this wasn't possible since the data from the
  mdf_message_t structure had been encrypted, and thus
  re-encrypted on the next call, sending garbled data.
* New function:
 - mdf_message_add_uint() : allows clients to add scaled
   unsigned integers to a MDF message without having to
   convert them to strings first.

Changes in release 1.0.12:
* performance of mdf_message_add_string() increased by orders of
  magnitude for strings <= 100 chars.
* performance of mdf_message_add_time() increased by avg 300%
* performance of mdf_message_add_date() increased by avg 1300%
* performance of mdf_get_next_field() increased by 500% on average
  by replacing sprintf() with an internal number-to-string function.

Changes in release 1.0.11:
* Fix when receiving internal messages (such as heartbeats)
  mdf_get_next_message() could sometimes report an error.
* Fix encoding numerics in the range 104.001 - 104.999
* Fix heartbeats was always sent unencrypted (not a big issue
  since the server does not requests hearbeats at the moment,
  so mdf has never actually sent one :)

Changes in release 1.0.10:
* Support clustered messages (an array of messages with the same
  insref and mref) when decoding.
* Improved building under MinGW
* Added project files for Microsoft Visual Studio 2010

Changes in release 1.0.9:
* mdf_consume() does now work on chunk reads. I.e now it tries to read
  as many bytes as possible into memory for increased performance.
* Fix segfault on oom conditions for bcd and uncompressed string
* Set error code on all errenous exits from mdf_get_next_field()
* Support unix domain sockets (internally used by Millistream only)
* Fix mdf_add_numeric() did errenous encoding when number was 104.[1001-8577]
* Build fix for Solaris

Changes in release 1.0.8:
* New properties:
 - MDF_OPT_TIME_DIFFERENCE: the time difference in number of seconds
   between the client and the server. The value should be added to the
   current time on the client in order to get the server time. Please
   note that this can be a negative value if the client clock is ahead
   of the server clock!

Changes in release 1.0.7:
* Support encryption rekey requests from server

Changes in release 1.0.6:
* Fix sending messages with insref > 65535

Changes in release 1.0.5:
* Fix debian dev packages had the wrong dependencies
* Optimizated when resizing the result value string

Changes in release 1.0.4:
* New properties:
 - MDF_OPT_NO_ENCRYPTION: disable encryption when sending messages to
   the server (the encryption from the server to the client can only
   be controlled by the server), for use when operating over a secure
   channel, i.e VPN.
* Rekey the encryption key if sent more than 4GiB of data
* Fix memleak in mdf_disconnect() for the crypto iv
* Fix mdf_add_numeric will now treat an empty string as NULL, and will
  also skip a prefixing '=' character before the number, if found.
* Fix do not send empty messages
* Fix possible buffer overflow if received forged packet where tlen was
  less than 5 bytes

Changes in release 1.0.3:
* Obfuscate the password length by making sure that that message part is
  always at least 50 bytes. This would remove any possibility to perform
  traffic analysis in order to recover the password.
* New test, testing the endianess macros
* Fix handle partial writes on unix platforms where writev() might be partly
  cancelled by a signal
* Fix retry the message send if writev() failed completely due to a signal
* New properties:
 - MDF_OPT_TCP_NODELAY: enables the client to disable the Nagle algorithm
* Build fix link with the crypto library instead of the complete OpenSSL
  library suite on automake targets

Changes in release 1.0.2:
* New properties:
 - MDF_OPT_HEARTBEAT_INTERVAL: the number of seconds the connection can be
   idle before we send a heartbeat request
 - MDF_OPT_HEARTBEAT_MAX_MISSED: the number of outstanding heartbeat requests
   before the connection is considered down
* Fix heartbeat requests was not encrypted so the server would never answer
  them since it refuses to reply to unauthenticated messages

