/TLSSocket

TLS socket on mbed OS

Primary LanguageC++Apache License 2.0Apache-2.0

WORK-IN-PROGRESS: TLSSocket

This implementation is based on yet unreleased Abstract socket interfaces currently in Mbed OS master branch. This interface will be released in Mbed OS 5.10, but is not yet released in 5.9

More info:

This library is created based on mbed-os-example-tls-tls-client project.

How to use it

#include "mbed.h"
#include "NetworkInterface.h"
#include "TLSSocket.h"

const char* HOST_NAME = "os.mbed.com";
const int PORT = 443;
const char* HTTPS_PATH = "/";

const char* cert = \
    "-----BEGIN CERTIFICATE-----\n" \
    "MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\n" \
    "A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\n" \
    "b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\n" \
    "MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\n" \
    "YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\n" \
    "aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\n" \
    "jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\n" \
    "xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\n" \
    "1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\n" \
    "snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\n" \
    "U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\n" \
    "9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\n" \
    "BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\n" \
    "AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\n" \
    "yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\n" \
    "38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\n" \
    "AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\n" \
    "DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\n" \
    "HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n" \
    "-----END CERTIFICATE-----";


/** Demonstrate download from a HTTP server through abstract socket interface
 *  Socket can be any connected socket, TCP or TLS
 */
int http_get(Socket *socket)
{
    const size_t buf_size = 1024;
    char *buf = new char[buf_size];

    // Send HTTP request
    /* "Connection: close" header is specified to detect end of the body
     * contents by connection close notification. If this is not specified,
     * connection is kept, and need to detect end of the content in another
     * way.
     */
    int len = snprintf(buf, buf_size,
                "GET %s HTTP/1.1\n"
                "Host: %s\n"
                "Connection: close\n"
                "\n", HTTPS_PATH, HOST_NAME);
    printf("\n%s", buf);
    int rc = 0;
    rc = socket->send(buf, len);
    if(rc < 0) {
        printf("send error.\n");
        return rc;
    }

    // Receive response from the server
    while((rc = socket->recv(buf, buf_size - 1)) > 0) {
        buf[rc] = '\0';
        printf("%s", buf);
    }
    if(rc < 0) {
        printf("\n! Read failed. err code = %d\n", rc);
        return rc;
    }

    delete[] buf;
    return 0;
}

int main(int argc, char* argv[]) {
    mbed_trace_init();

    printf("HelloTSLSocket, HTTPS example of TLSSocket\n");
    printf("\n");

    // Open a network interface
    NetworkInterface* network = NetworkInterface::get_default_instance();

    if (network->connect()) {
        printf("Unable to connect to network\n");
        return -1;
    }

    printf("Connected to network!\n");


    // Create transport socket
    TCPSocket tcp;
    nsapi_error_t err = tcp.open(network);
    MBED_ASSERT(err == NSAPI_ERROR_OK);

    // Resolve target name
    SocketAddress addr;
    err = network->gethostbyname(HOST_NAME, &addr);
    MBED_ASSERT(err == NSAPI_ERROR_OK);
    addr.set_port(PORT);

    // Connect the trasport
    printf("Connecting to %s\n", HOST_NAME);

    err = tcp.connect(addr);
    MBED_ASSERT(err == NSAPI_ERROR_OK);

    // Create a TLS socket
    TLSSocket tls(&tcp);

    // Set root CA certificate
    tls.set_root_ca_cert(cert);

    // Start TLS handshake
    printf("Start TLS handshake\n");
    if(tls.start_handshake(HOST_NAME) != 0) {
        printf("Failed to connect to the server.");
        return -1;
    }

    err = http_get(&tls);
    if (err == 0) {
        printf("HTTP Download succesfull\n");
    }

    // Done
    printf("HelloTSLSocket DONE.\n");

    tcp.close();
}