TLS 1.2 for Dynamic C 10
"Tom Collins tom-lnEA/wrDJtNWk0Htik3J/[email protected] [rabbit-semi]" <[email protected]> Tue, 26 Jan 2016 10:21:45 -0800
| Newsgroups | gmane.comp.hardware.rabbit-semiconductor |
|---|---|
| Message-ID | <[email protected]> |
I've been working to update Dynamic C 10's TLS (the protocol formerly known as SSL) implementation from 1.0 to 1.2, and feel that it's ready for testing if anyone is interested. Modern web browsers will refuse to connect to Rabbit products with the TLS 1.0 implementation, hence the push to support 1.2. Along the way, I removed support for protocols and ciphers now considered insecure.
I've pasted the draft release notes to the end of this email, and you can find the beta code on GitHub: https://github.com/digidotcom/DCRabbit_10/tree/feature-tls1.2
If you haven't already worked with the GitHub repository, be sure to follow the instructions in the README on how to link a Dynamic C installation to the repository so you can pull updates. If you are an inexperienced Git user, please make sure your Dynamic C directory is backed up, especially if you've made modifications to any of the files. I always recommend keeping your project files outside of the Dynamic C directory.
I have done some testing of HTTP server code (i.e., HTTPS), along with HTTP, SMTP and POP client code. I've run some OpenSSL scripts against the HTTP server to confirm correct operation (and an ability to handle large cipher lists in the Client Hello).
All testing has been with RSA certificates and not pre-shared keys (PSK mode).
If you are using PSK or some other uncommon TLS configuration, but don't have time to test the new release yourself, please email me with some details of how you've used TLS and I'll try to test that functionality myself.
Note that the update only supports the TLS 1.2 protocol, and cannot negotiate a TLS 1.1 or TLS 1.0 connection. This should make it more secure, but could cause problems with legacy web browsers that don't support TLS 1.2.
If you know of any TLS bugs (or even non-TLS bugs) present in 10.72, please let me know so I can ensure that they're addressed in an upcoming release. Please open issues on GitHub for tracking purposes, but feel free to email bug reports if that's your preference.
-Tom
ReleaseNotes_TLS1.2.txt:
Dynamic C 10.72A includes an update from TLS 1.0 to 1.2. This document
summarizes the impact this may have on your programs, and calls out
changes to "Dynamic C TCP/IP User’s Manual, Volume 3: Security".
http://ftp1.digi.com/support/documentation/90001160_a.pdf
This document assumes your program was already working with Dynamic C
10.72 before attempting an upgrade to 10.72A. SSL/TLS support has
changed with various Dynamic C releases, please test with 10.72 before
upgrading in order to isolate potential failures.
With TLS 1.2, Dynamic C 10.72A:
- Is compatible with modern web browsers.
- Removes support for insecure SSLv2, SSLv3 and TLS 1.0 protocols.
- Removes support for insecure RC4 cipher and MD5 digest.
- Automatically enables required AES128_CBC cipher.
- Adds optional AES256_CBC cipher, SHA256 digests, and support for
SHA256 signatures in X.509 (TLS/SSL) certificates.
Readers interested in the technical details of the switch from TLS 1.0
to TLS 1.2 might want to read section 1.1 of RFC4346 and section 1.2
of RFC5246, which document the differences between TLS 1.0/1.1 and
TLS 1.1/1.2 respectively.
https://tools.ietf.org/html/rfc4346#section-1.1
https://tools.ietf.org/html/rfc5246#section-1.2
Macros used to configure TLS 1.2 (in addition to existing
documentation):
TLS_VERBOSE: Define to see debugging information dumped to STDOUT that
may help in troubleshooting or reporting connectivity issues. Be
sure to disable this in production firmware.
SSL_USE_AES256: Define to enable 256-bit versions of the AES128_CBC
ciphersuites (in addition to AES128_CBC which is always required).
SSL_USE_PSK: Define to use pre-shared keys for authentication.
SSL_DONT_USE_RSA: Define to disable support for RSA certificates (you
must then define SSL_USE_PSK to use pre-shared keys instead).
MP_SIZE: The default value of 130 only allows for 1024-bit RSA keys.
Most certificates are using 2048-bit keys (#define MP_SIZE 258) and
4096-bit keys will only become more common (#define MP_SIZE 514).
SSL_DISABLE_LEGACY_DCC: If you aren't using the ".dcc" filetype, you
can define this macro to reduce code size.
SSL_DISABLE_USERBLOCK: If you aren't storing certificates in the
UserBlock, you can define this macro to reduce code size.
The following macros are no longer used or have been deprecated:
SSL_USE_AES: Defining this macro previously enabled the optional
AES128_CBC cipher. Since it's required by TLS 1.2, and support
for the insecure RC4 cipher was removed, AES128_CBC is enabled
by default and cannot be disbled.
SSL_DONT_USE_RC4: Support for RC4 was removed.
SSL_S_FORBID_MD5 and SSL_S_FORBID_RC4: TLS 1.2 doesn't use the MD5
digest or RC4 cipher, so it now ignores these flags.