This is a fork of the mbed port of axTLS

Dependents:   TLS_axTLS-Example HTTPSClientExample

Overview

This library is a fork from the mbed port of axTLS. It attempts to :

  • reduce the usage of dynamic memory
  • verify certificates with key size up to 2048 bits
  • provide a simple interface

Encryption

This library uses either RC4 or AES for encryption.

Memory usage

During the establishment of a connection, about 10KB of memory is allocated dynamically (it depends on certificates). Once the connection is established, the memory consumption is relatively low. This means that your program must not use too much static memory or allocate memory before you establish a TLS connection.

Certificates

Certificates are the major source of problem and will often be the reason why your program will crash. Due to memory constraint, there are some limitations on certificates :

  • Each certificate must not be bigger than 2KB
  • TLS client can only handle a chain of up to three certificates (excluding the root certificate). This means that the server must not send more than three certificates.

Also, this library can only load certificates following these specifications :

  • encoded in binary DER format (PKCS1)
  • The public key must use RSA only

Once the connection is established, you should free all loaded certificates by calling CertificateManager::clear(). This will free a few kilobytes (it depends on your certificates). In addition, to enable certificate verification during the connection, this library has a "precomputed mode". This mode uses much less memory than a normal certificate verification.

Normal mode

You need to copy the root certificate in binary-DER format on the mbed. Then in your code, let's say that your root certificate is saved on the mbed as "root.der", assuming that you include CertificateManager.h and that you created a LocalFileSystem, you can load this certificate as this ;

Load root certificate

CertificateManager::add("/local/root.der");
CertificateManager::load();

Do not forget that this mode takes quite a lot of memory ( the memory peak is high while verifying certificates) and will only work if the key size is not bigger than 1024 bits (otherwise it will crash while verifying certificates).

Precomputed mode

In this mode, you need to save the entire chain of certificates (in binary-DER format) including the root certificate on the mbed. In practice, this means that you must first retrieve all certificates that the server sends during a connection and then find the right root certificate. In your code, you must call CertificateManager::add for each certificate and in the right order : from the server certificate to the root certificate. Here is how you shoud load certificates in this mode :

Loadcertificates in precomputed mode

CertificateManager::add("/local/server1.der");
CertificateManager::add("/local/server2.der");
CertificateManager::add("/local/server3.der");
CertificateManager::add("/local/root.der");
CertificateManager::load(true);

Using this mode, you should be able to verify certificates with key size up to 2048 bits.

How do I find these certificates ?

I posted an entry in my notebook detailing how to get certificates from a server. You should be able to get all certificates you need except the root certificate. Here is a way how to get the root certificate on windows :

  1. Open (double-click) the last certificate sent by the server
  2. Go to details panel and click on the entry called Issuer. The first line gives you the name of this certificate and the second line indicates the company who created this certificate
  3. Open firefox
  4. Go to options, advanced panel and click on View Certificates
  5. Go to Authorities panel
  6. Choose the certificate whose name match the issuer of the last certificate sent by the server
  7. Export this certificate to binary-DER format.

Connect to mbed.org !

Import programTLS_axTLS-Example

Establishing a connection to mbed.org using TLS

Committer:
feb11
Date:
Thu Sep 12 15:18:04 2013 +0000
Revision:
0:85fceccc1a7c
intial import

Who changed what in which revision?

UserRevisionLine numberNew contents of line
feb11 0:85fceccc1a7c 1 #ifndef CONFIG_H
feb11 0:85fceccc1a7c 2 #define CONFIG_H
feb11 0:85fceccc1a7c 3 #define CONFIG_DEBUG
feb11 0:85fceccc1a7c 4 #define CONFIG_STRIP_UNWANTED_SECTIONS 1
feb11 0:85fceccc1a7c 5
feb11 0:85fceccc1a7c 6 /*
feb11 0:85fceccc1a7c 7 * BigInt Options
feb11 0:85fceccc1a7c 8 */
feb11 0:85fceccc1a7c 9 #define CONFIG_BIGINT_BARRETT 1
feb11 0:85fceccc1a7c 10 #define CONFIG_BIGINT_CRT 1
feb11 0:85fceccc1a7c 11 #define CONFIG_INTEGER_32BIT 1
feb11 0:85fceccc1a7c 12
feb11 0:85fceccc1a7c 13 /*
feb11 0:85fceccc1a7c 14 * SSL Library
feb11 0:85fceccc1a7c 15 */
feb11 0:85fceccc1a7c 16 #define CONFIG_SSL_ENABLE_CLIENT 1
feb11 0:85fceccc1a7c 17 //#define CONFIG_SSL_SKELETON_MODE
feb11 0:85fceccc1a7c 18 #define CONFIG_SSL_PROT_LOW 1
feb11 0:85fceccc1a7c 19 //#undef CONFIG_SSL_PROT_MEDIUM
feb11 0:85fceccc1a7c 20 //#undef CONFIG_SSL_PROT_HIGH
feb11 0:85fceccc1a7c 21 #define CONFIG_SSL_USE_DEFAULT_KEY 1
feb11 0:85fceccc1a7c 22 #define CONFIG_SSL_PRIVATE_KEY_LOCATION ""
feb11 0:85fceccc1a7c 23 #define CONFIG_SSL_PRIVATE_KEY_PASSWORD ""
feb11 0:85fceccc1a7c 24 #define CONFIG_SSL_X509_CERT_LOCATION ""
feb11 0:85fceccc1a7c 25 #undef CONFIG_SSL_GENERATE_X509_CERT
feb11 0:85fceccc1a7c 26 #define CONFIG_SSL_X509_COMMON_NAME ""
feb11 0:85fceccc1a7c 27 #define CONFIG_SSL_X509_ORGANIZATION_NAME ""
feb11 0:85fceccc1a7c 28 #define CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME ""
feb11 0:85fceccc1a7c 29 #undef CONFIG_SSL_ENABLE_V23_HANDSHAKE
feb11 0:85fceccc1a7c 30 #undef CONFIG_SSL_HAS_PEM
feb11 0:85fceccc1a7c 31 #undef CONFIG_SSL_USE_PKCS12
feb11 0:85fceccc1a7c 32 #define CONFIG_SSL_EXPIRY_TIME 24
feb11 0:85fceccc1a7c 33 #define CONFIG_X509_MAX_CA_CERTS 1
feb11 0:85fceccc1a7c 34 #define CONFIG_SSL_MAX_CERTS 1
feb11 0:85fceccc1a7c 35 #undef CONFIG_SSL_CTX_MUTEXING
feb11 0:85fceccc1a7c 36 #undef CONFIG_USE_DEV_URANDOM
feb11 0:85fceccc1a7c 37 #undef CONFIG_WIN32_USE_CRYPTO_LIB
feb11 0:85fceccc1a7c 38 #undef CONFIG_OPENSSL_COMPATIBLE
feb11 0:85fceccc1a7c 39 #undef CONFIG_PERFORMANCE_TESTING
feb11 0:85fceccc1a7c 40 #undef CONFIG_SSL_TEST
feb11 0:85fceccc1a7c 41 #undef CONFIG_AXTLSWRAP
feb11 0:85fceccc1a7c 42 #undef CONFIG_AXHTTPD
feb11 0:85fceccc1a7c 43 #undef CONFIG_HTTP_STATIC_BUILD
feb11 0:85fceccc1a7c 44 #undef CONFIG_HTTP_HAS_CGI
feb11 0:85fceccc1a7c 45 #define CONFIG_HTTP_CGI_EXTENSIONS ""
feb11 0:85fceccc1a7c 46 #undef CONFIG_HTTP_ENABLE_LUA
feb11 0:85fceccc1a7c 47 #define CONFIG_HTTP_LUA_PREFIX ""
feb11 0:85fceccc1a7c 48 #undef CONFIG_HTTP_BUILD_LUA
feb11 0:85fceccc1a7c 49 #define CONFIG_HTTP_CGI_LAUNCHER ""
feb11 0:85fceccc1a7c 50 #undef CONFIG_HTTP_DIRECTORIES
feb11 0:85fceccc1a7c 51 #undef CONFIG_HTTP_HAS_AUTHORIZATION
feb11 0:85fceccc1a7c 52 #undef CONFIG_HTTP_HAS_IPV6
feb11 0:85fceccc1a7c 53 #undef CONFIG_HTTP_ENABLE_DIFFERENT_USER
feb11 0:85fceccc1a7c 54 #define CONFIG_HTTP_USER ""
feb11 0:85fceccc1a7c 55 #undef CONFIG_HTTP_VERBOSE
feb11 0:85fceccc1a7c 56 #undef CONFIG_HTTP_IS_DAEMON
feb11 0:85fceccc1a7c 57 #define CONFIG_SSL_CERT_VERIFICATION
feb11 0:85fceccc1a7c 58 #define CONFIG_SSL_FULL_MODE
feb11 0:85fceccc1a7c 59
feb11 0:85fceccc1a7c 60 #define MBED
feb11 0:85fceccc1a7c 61
feb11 0:85fceccc1a7c 62 #endif
feb11 0:85fceccc1a7c 63