diff --git a/examples/http_get_bearssl/Makefile b/examples/http_get_bearssl/Makefile index c16c561..5f0b736 100644 --- a/examples/http_get_bearssl/Makefile +++ b/examples/http_get_bearssl/Makefile @@ -1,4 +1,6 @@ PROGRAM=http_get_bearssl EXTRA_COMPONENTS = extras/bearssl +EXTRA_CFLAGS +=-DCONFIG_EPOCH_TIME=$(shell date --utc '+%s') + include ../../common.mk diff --git a/examples/http_get_bearssl/http_get_bearssl.c b/examples/http_get_bearssl/http_get_bearssl.c index 1b3336b..593b423 100644 --- a/examples/http_get_bearssl/http_get_bearssl.c +++ b/examples/http_get_bearssl/http_get_bearssl.c @@ -29,53 +29,18 @@ #include "bearssl.h" +#define CLOCK_SECONDS_PER_MINUTE (60UL) +#define CLOCK_MINUTES_PER_HOUR (60UL) +#define CLOCK_HOURS_PER_DAY (24UL) +#define CLOCK_SECONDS_PER_HOUR (CLOCK_MINUTES_PER_HOUR*CLOCK_SECONDS_PER_MINUTE) +#define CLOCK_SECONDS_PER_DAY (CLOCK_HOURS_PER_DAY*CLOCK_SECONDS_PER_HOUR) + #define WEB_SERVER "www.howsmyssl.com" #define WEB_PORT "443" #define WEB_URL "https://www.howsmyssl.com/a/check" #define GET_REQUEST "GET "WEB_URL" HTTP/1.1\nHost: "WEB_SERVER"\n\n" -/* - * howsmyssl.com public key - * BearSSL doesn't allow disabling validation and we don't have - * a correct date/time on the ESP so it would always fail. - * Instead, we compare the server key against this static public key - * to validate the server. - */ -static const unsigned char SERVER_PKEY_RSA_N[] = { - 0xA9, 0x11, 0x5C, 0xAF, 0x4F, 0xDD, 0xEB, 0x88, 0xCD, 0xF6, 0x47, 0x11, - 0xB9, 0x7F, 0xFA, 0x08, 0xD7, 0x90, 0x01, 0x14, 0x36, 0x84, 0xBF, 0xE2, - 0xD8, 0xC4, 0x26, 0xBF, 0xD3, 0x6B, 0xBA, 0x2E, 0x06, 0x9C, 0x23, 0x95, - 0x98, 0x8E, 0xC0, 0xC5, 0x91, 0xF0, 0xC6, 0xC3, 0x39, 0x98, 0x04, 0xC6, - 0x78, 0x14, 0x13, 0x08, 0xA7, 0x12, 0x3D, 0x86, 0x1A, 0x14, 0x71, 0x35, - 0x7E, 0xFB, 0x8B, 0xF8, 0xA1, 0x52, 0x21, 0x5B, 0xDE, 0x51, 0x5A, 0x3A, - 0x35, 0x6F, 0x8F, 0xDB, 0xF9, 0x6A, 0xA5, 0xF2, 0x74, 0x6E, 0xCA, 0xFC, - 0xA4, 0x70, 0xCC, 0x70, 0x4D, 0x5E, 0x4E, 0x69, 0xA2, 0xFE, 0x42, 0x23, - 0x8A, 0xC0, 0x01, 0x3B, 0xEF, 0x46, 0xB4, 0xC2, 0x6F, 0x48, 0x26, 0xDD, - 0xF5, 0x05, 0x9B, 0x69, 0x88, 0xB0, 0x7D, 0x38, 0xA8, 0x49, 0x07, 0x11, - 0xE5, 0xFE, 0x27, 0x0F, 0x4F, 0x28, 0x83, 0x18, 0xAB, 0x47, 0x1F, 0x72, - 0x40, 0xEC, 0x67, 0x16, 0xBE, 0x45, 0x76, 0x0B, 0x83, 0x91, 0xE5, 0x42, - 0xC2, 0xA2, 0x5B, 0xF2, 0xEB, 0xB1, 0x8C, 0x37, 0x0F, 0x4B, 0x5E, 0x0F, - 0x05, 0x7D, 0x54, 0x48, 0x9F, 0x55, 0xAE, 0x41, 0xC9, 0x07, 0x6F, 0xD7, - 0xB3, 0xF3, 0xE2, 0x61, 0x18, 0x03, 0x48, 0xA1, 0x3C, 0x8D, 0xBD, 0x5C, - 0xCD, 0x3B, 0x55, 0xCD, 0x97, 0xE3, 0xD1, 0x80, 0x8A, 0x30, 0x88, 0x3A, - 0xAC, 0xEE, 0x64, 0x08, 0xBD, 0x74, 0x82, 0x24, 0x82, 0x11, 0xD4, 0x93, - 0xFA, 0xEF, 0x52, 0x5F, 0x2C, 0x51, 0x0C, 0x88, 0x09, 0xB9, 0x77, 0xA0, - 0xFA, 0x6F, 0xAB, 0xEB, 0xE1, 0x08, 0x5C, 0xA5, 0x02, 0x53, 0xA1, 0x18, - 0xFC, 0xB8, 0x06, 0x67, 0x7E, 0x80, 0xDF, 0xF1, 0xCD, 0xAE, 0x23, 0x58, - 0xCD, 0xCE, 0x7C, 0x69, 0x2E, 0x4D, 0xD6, 0xB0, 0xD2, 0x6D, 0x11, 0x85, - 0x5E, 0x36, 0x41, 0x27 -}; - -static const unsigned char SERVER_PKEY_RSA_E[] = { - 0x01, 0x00, 0x01 -}; - -static const br_rsa_public_key server_pkey = { - (unsigned char *)SERVER_PKEY_RSA_N, sizeof SERVER_PKEY_RSA_N, - (unsigned char *)SERVER_PKEY_RSA_E, sizeof SERVER_PKEY_RSA_E, -}; - /* * Low-level data read callback for the simplified SSL I/O API. */ @@ -116,6 +81,76 @@ sock_write(void *ctx, const unsigned char *buf, size_t len) } } +/* + * The hardcoded trust anchors. These are the two DN + public key that + * correspond to the self-signed certificates cert-root-rsa.pem and + * cert-root-ec.pem. + * + * C code for hardcoded trust anchors can be generated with the "brssl" + * command-line tool (with the "ta" command). + * + * Below is the imported "Let's Encrypt" root certificate, as howsmyssl + * is depending on it: + * + * https://letsencrypt.org/certs/letsencryptauthorityx3.pem + * + */ + +static const unsigned char TA0_DN[] = { + 0x30, 0x4A, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0A, + 0x13, 0x0D, 0x4C, 0x65, 0x74, 0x27, 0x73, 0x20, 0x45, 0x6E, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x1A, 0x4C, 0x65, 0x74, 0x27, 0x73, 0x20, 0x45, 0x6E, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, + 0x79, 0x20, 0x58, 0x33 +}; + +static const unsigned char TA0_RSA_N[] = { + 0x9C, 0xD3, 0x0C, 0xF0, 0x5A, 0xE5, 0x2E, 0x47, 0xB7, 0x72, 0x5D, 0x37, + 0x83, 0xB3, 0x68, 0x63, 0x30, 0xEA, 0xD7, 0x35, 0x26, 0x19, 0x25, 0xE1, + 0xBD, 0xBE, 0x35, 0xF1, 0x70, 0x92, 0x2F, 0xB7, 0xB8, 0x4B, 0x41, 0x05, + 0xAB, 0xA9, 0x9E, 0x35, 0x08, 0x58, 0xEC, 0xB1, 0x2A, 0xC4, 0x68, 0x87, + 0x0B, 0xA3, 0xE3, 0x75, 0xE4, 0xE6, 0xF3, 0xA7, 0x62, 0x71, 0xBA, 0x79, + 0x81, 0x60, 0x1F, 0xD7, 0x91, 0x9A, 0x9F, 0xF3, 0xD0, 0x78, 0x67, 0x71, + 0xC8, 0x69, 0x0E, 0x95, 0x91, 0xCF, 0xFE, 0xE6, 0x99, 0xE9, 0x60, 0x3C, + 0x48, 0xCC, 0x7E, 0xCA, 0x4D, 0x77, 0x12, 0x24, 0x9D, 0x47, 0x1B, 0x5A, + 0xEB, 0xB9, 0xEC, 0x1E, 0x37, 0x00, 0x1C, 0x9C, 0xAC, 0x7B, 0xA7, 0x05, + 0xEA, 0xCE, 0x4A, 0xEB, 0xBD, 0x41, 0xE5, 0x36, 0x98, 0xB9, 0xCB, 0xFD, + 0x6D, 0x3C, 0x96, 0x68, 0xDF, 0x23, 0x2A, 0x42, 0x90, 0x0C, 0x86, 0x74, + 0x67, 0xC8, 0x7F, 0xA5, 0x9A, 0xB8, 0x52, 0x61, 0x14, 0x13, 0x3F, 0x65, + 0xE9, 0x82, 0x87, 0xCB, 0xDB, 0xFA, 0x0E, 0x56, 0xF6, 0x86, 0x89, 0xF3, + 0x85, 0x3F, 0x97, 0x86, 0xAF, 0xB0, 0xDC, 0x1A, 0xEF, 0x6B, 0x0D, 0x95, + 0x16, 0x7D, 0xC4, 0x2B, 0xA0, 0x65, 0xB2, 0x99, 0x04, 0x36, 0x75, 0x80, + 0x6B, 0xAC, 0x4A, 0xF3, 0x1B, 0x90, 0x49, 0x78, 0x2F, 0xA2, 0x96, 0x4F, + 0x2A, 0x20, 0x25, 0x29, 0x04, 0xC6, 0x74, 0xC0, 0xD0, 0x31, 0xCD, 0x8F, + 0x31, 0x38, 0x95, 0x16, 0xBA, 0xA8, 0x33, 0xB8, 0x43, 0xF1, 0xB1, 0x1F, + 0xC3, 0x30, 0x7F, 0xA2, 0x79, 0x31, 0x13, 0x3D, 0x2D, 0x36, 0xF8, 0xE3, + 0xFC, 0xF2, 0x33, 0x6A, 0xB9, 0x39, 0x31, 0xC5, 0xAF, 0xC4, 0x8D, 0x0D, + 0x1D, 0x64, 0x16, 0x33, 0xAA, 0xFA, 0x84, 0x29, 0xB6, 0xD4, 0x0B, 0xC0, + 0xD8, 0x7D, 0xC3, 0x93 +}; + +static const unsigned char TA0_RSA_E[] = { + 0x01, 0x00, 0x01 +}; + +static const br_x509_trust_anchor TAs[1] = { + { + { (unsigned char *)TA0_DN, sizeof TA0_DN }, + BR_X509_TA_CA, + { + BR_KEYTYPE_RSA, + { .rsa = { + (unsigned char *)TA0_RSA_N, sizeof TA0_RSA_N, + (unsigned char *)TA0_RSA_E, sizeof TA0_RSA_E, + } } + } + } +}; + +#define TAs_NUM 1 + /* * Buffer to store a record + BearSSL state * We use MONO mode to save 16k of RAM. @@ -126,12 +161,13 @@ static unsigned char bearssl_buffer[BR_SSL_BUFSIZE_MONO]; static br_ssl_client_context sc; static br_x509_minimal_context xc; -static br_x509_knownkey_context kkc; static br_sslio_context ioc; void http_get_task(void *pvParameters) { int successes = 0, failures = 0; + int provisional_time = 0; + while (1) { /* * Wait until we can resolve the DNS for the server, as an indication @@ -159,15 +195,7 @@ void http_get_task(void *pvParameters) } printf("Initializing BearSSL... "); - br_ssl_client_init_full(&sc, &xc, NULL, 0); - - /* - * Overwrite the default X509 engine with a much simpler known key one - * This sidesteps validation failure in the default engine, as we have no date/time - * Instead, the servers key is compared to the hardcoded public key above - */ - br_x509_knownkey_init_rsa(&kkc, &server_pkey); - br_ssl_engine_set_x509(&sc.eng, &kkc.vtable); + br_ssl_client_init_full(&sc, &xc, TAs, TAs_NUM); /* * Set the I/O buffer to the provided array. We allocated a @@ -201,6 +229,15 @@ void http_get_task(void *pvParameters) br_sslio_init(&ioc, &sc.eng, sock_read, &fd, sock_write, &fd); printf("done.\r\n"); + /* FIXME: set date & time using epoch time precompiler flag for now */ + provisional_time = CONFIG_EPOCH_TIME + (xTaskGetTickCount()/configTICK_RATE_HZ); + xc.days = (provisional_time / CLOCK_SECONDS_PER_DAY) + 719528; + xc.seconds = provisional_time % CLOCK_SECONDS_PER_DAY; + printf("Time: %02i:%02i\r\n", + (int)(xc.seconds / CLOCK_SECONDS_PER_HOUR), + (int)((xc.seconds % CLOCK_SECONDS_PER_HOUR)/CLOCK_SECONDS_PER_MINUTE) + ); + if (connect(fd, res->ai_addr, res->ai_addrlen) != 0) { close(fd); @@ -267,13 +304,18 @@ void http_get_task(void *pvParameters) continue; } + printf("\r\n\r\nfree heap pre = %u\r\n", xPortGetFreeHeapSize()); + /* * Close the connection and start over after a delay */ close(fd); freeaddrinfo(res); + + printf("free heap post = %u\r\n", xPortGetFreeHeapSize()); + successes++; - printf("\r\n\r\nsuccesses = %d failures = %d\r\n", successes, failures); + printf("successes = %d failures = %d\r\n", successes, failures); for(int countdown = 10; countdown >= 0; countdown--) { printf("%d...\n", countdown); vTaskDelay(1000 / portTICK_PERIOD_MS); diff --git a/examples/tls_server_bearssl/certificate.h b/examples/tls_server_bearssl/certificate.h index 45f0fdf..bafd713 100644 --- a/examples/tls_server_bearssl/certificate.h +++ b/examples/tls_server_bearssl/certificate.h @@ -1,97 +1,183 @@ +/* + * Copyright (c) 2016 Thomas Pornin + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + #include "bearssl.h" /* - * Server certificate chain - * Generated using brssl ta certificate.pem + * A sample server certificate chain with a single intermediate CA. + * Certificate key type: RSA + * Signing algorithm for both certificates: RSA */ static const unsigned char CERT0[] = { - 0x30, 0x82, 0x03, 0xC9, 0x30, 0x82, 0x02, 0xB1, 0xA0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x09, 0x00, 0xF1, 0x32, 0x8D, 0x73, 0x19, 0xEA, 0x40, 0x2C, - 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, - 0x0B, 0x05, 0x00, 0x30, 0x7B, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, - 0x04, 0x06, 0x13, 0x02, 0x41, 0x55, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03, - 0x55, 0x04, 0x08, 0x0C, 0x03, 0x56, 0x69, 0x63, 0x31, 0x12, 0x30, 0x10, - 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x09, 0x4D, 0x65, 0x6C, 0x62, 0x6F, - 0x75, 0x72, 0x6E, 0x65, 0x31, 0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, - 0x0A, 0x0C, 0x15, 0x65, 0x73, 0x70, 0x2D, 0x6F, 0x70, 0x65, 0x6E, 0x2D, - 0x72, 0x74, 0x6F, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4C, 0x74, 0x64, - 0x31, 0x1C, 0x30, 0x1A, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x13, 0x53, - 0x6E, 0x61, 0x6B, 0x65, 0x6F, 0x69, 0x6C, 0x20, 0x53, 0x61, 0x6C, 0x65, - 0x73, 0x20, 0x55, 0x6E, 0x69, 0x74, 0x31, 0x0C, 0x30, 0x0A, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0C, 0x03, 0x65, 0x73, 0x70, 0x30, 0x1E, 0x17, 0x0D, - 0x31, 0x36, 0x30, 0x32, 0x30, 0x38, 0x30, 0x33, 0x34, 0x34, 0x35, 0x35, - 0x5A, 0x17, 0x0D, 0x31, 0x37, 0x30, 0x32, 0x30, 0x37, 0x30, 0x33, 0x34, - 0x34, 0x35, 0x35, 0x5A, 0x30, 0x7B, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x41, 0x55, 0x31, 0x0C, 0x30, 0x0A, 0x06, - 0x03, 0x55, 0x04, 0x08, 0x0C, 0x03, 0x56, 0x69, 0x63, 0x31, 0x12, 0x30, - 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x09, 0x4D, 0x65, 0x6C, 0x62, - 0x6F, 0x75, 0x72, 0x6E, 0x65, 0x31, 0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, - 0x04, 0x0A, 0x0C, 0x15, 0x65, 0x73, 0x70, 0x2D, 0x6F, 0x70, 0x65, 0x6E, - 0x2D, 0x72, 0x74, 0x6F, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4C, 0x74, - 0x64, 0x31, 0x1C, 0x30, 0x1A, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x13, - 0x53, 0x6E, 0x61, 0x6B, 0x65, 0x6F, 0x69, 0x6C, 0x20, 0x53, 0x61, 0x6C, - 0x65, 0x73, 0x20, 0x55, 0x6E, 0x69, 0x74, 0x31, 0x0C, 0x30, 0x0A, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x0C, 0x03, 0x65, 0x73, 0x70, 0x30, 0x82, 0x01, + 0x30, 0x82, 0x03, 0x3C, 0x30, 0x82, 0x02, 0x24, 0xA0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x58, 0xDA, 0xBA, 0x36, 0xCD, 0xED, 0xA0, 0xDA, 0x5C, + 0x10, 0x33, 0x73, 0x8E, 0x0C, 0x64, 0x92, 0x79, 0x92, 0xAF, 0x03, 0x30, + 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, + 0x05, 0x00, 0x30, 0x27, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x43, 0x41, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x0F, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6D, 0x65, 0x64, + 0x69, 0x61, 0x74, 0x65, 0x20, 0x43, 0x41, 0x30, 0x1E, 0x17, 0x0D, 0x31, + 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5A, + 0x17, 0x0D, 0x33, 0x37, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, + 0x35, 0x39, 0x5A, 0x30, 0x21, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x43, 0x41, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x09, 0x6C, 0x6F, 0x63, 0x61, 0x6C, 0x68, 0x6F, + 0x73, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, + 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xD4, + 0x7A, 0x1D, 0x27, 0xBA, 0x2B, 0x3A, 0x67, 0xB2, 0x91, 0x6A, 0xFB, 0xE7, + 0x83, 0x44, 0xCA, 0xED, 0x1C, 0x75, 0xAD, 0xDD, 0x4D, 0x83, 0x62, 0xD6, + 0xAA, 0x68, 0x95, 0xB2, 0x24, 0x21, 0x7B, 0x15, 0xAE, 0x2A, 0x99, 0x68, + 0x15, 0xED, 0x66, 0xF0, 0xB8, 0x58, 0xE7, 0xD3, 0xF5, 0x2E, 0xC6, 0xD9, + 0x2A, 0x5E, 0xE7, 0x0E, 0x2E, 0xE7, 0xFC, 0x67, 0x59, 0xC0, 0xC8, 0x61, + 0x7D, 0x4B, 0xA4, 0x6F, 0xDD, 0x9F, 0xD9, 0xC8, 0x85, 0x87, 0x64, 0xC7, + 0xBA, 0x1A, 0x0F, 0x29, 0xD4, 0x96, 0xA8, 0x78, 0x9A, 0x6B, 0x62, 0x20, + 0xA9, 0x32, 0xD0, 0xEE, 0xA9, 0x8C, 0x28, 0x61, 0x47, 0xA2, 0x50, 0x2A, + 0x63, 0xF6, 0x21, 0xDE, 0xDA, 0xD8, 0xD5, 0xF0, 0x7F, 0xC5, 0x00, 0x82, + 0x70, 0xE6, 0xA3, 0xBF, 0x5C, 0x89, 0x27, 0x4F, 0x51, 0x92, 0x77, 0x03, + 0xC3, 0xB0, 0xCC, 0x2E, 0x3B, 0xEC, 0x23, 0xF2, 0x2F, 0x53, 0x41, 0xAF, + 0x89, 0x93, 0xFF, 0xD2, 0x80, 0xB1, 0x43, 0x97, 0xDE, 0xD6, 0x19, 0xA0, + 0x92, 0x12, 0x7A, 0x3D, 0x66, 0x79, 0xE1, 0xC1, 0xBC, 0xE1, 0x77, 0x70, + 0xA2, 0x8B, 0x3D, 0x46, 0x84, 0x53, 0x3F, 0xE4, 0x4E, 0x42, 0x41, 0x37, + 0x92, 0x1E, 0x1F, 0xFD, 0x38, 0xB3, 0xF7, 0xEF, 0x87, 0x39, 0x80, 0xD3, + 0x56, 0xCF, 0xF4, 0xE0, 0x13, 0xDE, 0x64, 0xB0, 0x72, 0xA4, 0x03, 0x84, + 0xC4, 0x41, 0xED, 0x6F, 0xFA, 0x3E, 0xE2, 0xCA, 0x04, 0x20, 0xD2, 0xD7, + 0xDC, 0x2C, 0x82, 0x2B, 0x7A, 0xE2, 0x6D, 0xA1, 0x1C, 0x48, 0xDB, 0xCF, + 0x89, 0x4F, 0x34, 0x97, 0x3D, 0x28, 0xA8, 0x53, 0xDA, 0xE7, 0xC1, 0xE1, + 0x73, 0x15, 0xA3, 0x30, 0x76, 0x7F, 0x8F, 0x23, 0x42, 0x14, 0x3D, 0x51, + 0x34, 0xD2, 0x5A, 0xAD, 0x3C, 0x9B, 0xCB, 0xC8, 0xFE, 0x7F, 0x6E, 0x8E, + 0x40, 0xF3, 0xBD, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x66, 0x30, 0x64, + 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, + 0x14, 0xC5, 0x01, 0xAD, 0x7C, 0xE6, 0x63, 0xC9, 0x9C, 0x17, 0x5F, 0xC5, + 0xA2, 0xA7, 0xE1, 0x50, 0x5F, 0xE8, 0xF5, 0xA8, 0xC6, 0x30, 0x1D, 0x06, + 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0xC5, 0x01, 0xAD, 0x7C, + 0xE6, 0x63, 0xC9, 0x9C, 0x17, 0x5F, 0xC5, 0xA2, 0xA7, 0xE1, 0x50, 0x5F, + 0xE8, 0xF5, 0xA8, 0xC6, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, + 0x01, 0xFF, 0x04, 0x02, 0x30, 0x00, 0x30, 0x14, 0x06, 0x03, 0x55, 0x1D, + 0x11, 0x04, 0x0D, 0x30, 0x0B, 0x82, 0x09, 0x6C, 0x6F, 0x63, 0x61, 0x6C, + 0x68, 0x6F, 0x73, 0x74, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, + 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x71, 0xB3, 0x5D, 0x21, 0xC2, 0x0E, 0xD7, 0xD0, 0xC6, 0xF8, 0x4A, 0x73, + 0x87, 0x4D, 0x22, 0x02, 0x27, 0xD0, 0xC7, 0xF8, 0xFD, 0x1A, 0x6D, 0x62, + 0x58, 0x82, 0x08, 0x76, 0x20, 0x07, 0xC0, 0x48, 0x92, 0xF3, 0xE9, 0x98, + 0x5A, 0xEB, 0x0D, 0x4E, 0x56, 0x95, 0x63, 0x68, 0x4D, 0xAB, 0xD4, 0x00, + 0x76, 0xE0, 0x37, 0xCF, 0x0B, 0x11, 0x61, 0x59, 0x5C, 0xDE, 0xF6, 0xA5, + 0x14, 0x59, 0xD9, 0x25, 0x9F, 0x59, 0xD9, 0xD3, 0x5E, 0x86, 0xAC, 0x1D, + 0xA6, 0x2C, 0x32, 0x42, 0x19, 0x32, 0x13, 0x40, 0x0B, 0x54, 0xCD, 0x67, + 0x26, 0xB6, 0xBD, 0xB4, 0x96, 0xA4, 0xCA, 0x1F, 0x7F, 0x37, 0xD6, 0xA8, + 0x75, 0xEB, 0x3A, 0x81, 0x51, 0x30, 0xB9, 0xF9, 0x4A, 0x01, 0x6F, 0xD1, + 0xD6, 0xED, 0x4F, 0xDF, 0x3F, 0x30, 0x60, 0x06, 0x67, 0x92, 0x8E, 0x61, + 0x85, 0x5F, 0x1A, 0xB5, 0x8C, 0xB3, 0x0F, 0x61, 0xA9, 0xFA, 0xDF, 0x5D, + 0xC4, 0x64, 0x00, 0xEA, 0x87, 0xB1, 0x33, 0x5F, 0x7D, 0xCB, 0xA3, 0x85, + 0x24, 0x6E, 0x2C, 0x65, 0x3B, 0xEA, 0x73, 0x3F, 0x86, 0xD3, 0xFD, 0xE8, + 0xE4, 0x02, 0xC6, 0x61, 0x6A, 0x26, 0x17, 0x52, 0x01, 0x25, 0x5C, 0x7F, + 0xA8, 0xCE, 0x69, 0x1F, 0xAC, 0x61, 0x2C, 0xB7, 0x04, 0xAF, 0xFD, 0xA4, + 0x7A, 0x99, 0xCB, 0x26, 0x15, 0x4C, 0xFF, 0x74, 0xD4, 0x73, 0x0C, 0x57, + 0x0C, 0x26, 0xEB, 0xD7, 0x2A, 0xDC, 0x5C, 0xC3, 0x41, 0xBB, 0xC2, 0xF3, + 0xCE, 0x16, 0xBD, 0x8E, 0x7B, 0xFB, 0xE9, 0xDF, 0xAB, 0x21, 0x0D, 0x91, + 0xB3, 0x8D, 0xD8, 0xCF, 0xC8, 0xF4, 0x49, 0xB9, 0xD0, 0xE3, 0x16, 0x70, + 0x3F, 0xB3, 0xDE, 0xD4, 0x07, 0x25, 0xFA, 0x46, 0x44, 0x52, 0x89, 0x4D, + 0x89, 0xC8, 0xE2, 0xCA, 0xB5, 0x33, 0x7F, 0xC7, 0x21, 0xBD, 0x28, 0xEF, + 0xFE, 0x66, 0x74, 0x03 +}; + +static const unsigned char CERT1[] = { + 0x30, 0x82, 0x03, 0x34, 0x30, 0x82, 0x02, 0x1C, 0xA0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x70, 0x0F, 0x60, 0xEE, 0xF0, 0x07, 0x9A, 0x9C, 0x69, + 0xAC, 0x97, 0x62, 0x26, 0x4F, 0x5D, 0x05, 0xB6, 0xF9, 0x8F, 0x48, 0x30, + 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, + 0x05, 0x00, 0x30, 0x1C, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x43, 0x41, 0x31, 0x0D, 0x30, 0x0B, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x04, 0x52, 0x6F, 0x6F, 0x74, 0x30, 0x1E, 0x17, 0x0D, + 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x5A, 0x17, 0x0D, 0x33, 0x37, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, + 0x39, 0x35, 0x39, 0x5A, 0x30, 0x27, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x41, 0x31, 0x18, 0x30, 0x16, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x13, 0x0F, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6D, + 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, - 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xAB, 0xE4, 0xFA, 0xBB, 0x54, 0x04, - 0x49, 0x24, 0xA6, 0xB9, 0x82, 0x5E, 0xBC, 0x17, 0x64, 0xC9, 0x01, 0x1B, - 0x09, 0xEF, 0x57, 0xE9, 0xE1, 0xAE, 0x3C, 0xB9, 0x53, 0xF0, 0xC2, 0xD9, - 0xBB, 0x2F, 0xB8, 0xA5, 0x8B, 0xEA, 0xB1, 0x86, 0xD0, 0x7B, 0xDC, 0x03, - 0xA3, 0xA6, 0x24, 0x7F, 0x66, 0xA2, 0x41, 0x92, 0x93, 0x2B, 0x4A, 0x36, - 0xCD, 0x74, 0x73, 0xE9, 0xBF, 0x3F, 0x41, 0x93, 0x5E, 0xB8, 0x9A, 0xCB, - 0xFC, 0xD4, 0x35, 0xF3, 0x0E, 0xEC, 0xE7, 0xE5, 0x05, 0xEE, 0xBD, 0xB2, - 0x3C, 0xEC, 0x81, 0x5D, 0x9C, 0x23, 0x3E, 0x23, 0xEC, 0x4B, 0x48, 0xF0, - 0xA3, 0x05, 0xB3, 0xE3, 0x3D, 0x0B, 0x26, 0xED, 0x42, 0x54, 0x1B, 0xDA, - 0x5F, 0x8C, 0x00, 0x19, 0x94, 0x5E, 0x0A, 0x00, 0xDE, 0x77, 0x38, 0xBA, - 0x4A, 0x39, 0xEB, 0xBA, 0xBA, 0xDE, 0xDB, 0xD2, 0x51, 0xC9, 0xD4, 0x7F, - 0xD8, 0x2D, 0xE0, 0x4E, 0x31, 0xC4, 0x5E, 0x4D, 0xB3, 0x9B, 0x61, 0xAE, - 0x90, 0x1C, 0xEE, 0x3E, 0x46, 0x5E, 0xE7, 0xF4, 0xC3, 0x24, 0x0E, 0x0D, - 0x60, 0x78, 0x2B, 0x16, 0x6A, 0xCE, 0x8B, 0xCE, 0x73, 0xD5, 0x33, 0x52, - 0x72, 0xEE, 0x48, 0x7B, 0x21, 0x96, 0x77, 0x02, 0xCF, 0xB8, 0x75, 0x0F, - 0x95, 0xDD, 0x52, 0x77, 0xFE, 0xDF, 0xFE, 0x94, 0xE2, 0xB9, 0x3B, 0xE5, - 0xAD, 0x01, 0x66, 0x7D, 0xE9, 0xBE, 0xC0, 0x1F, 0x17, 0x34, 0x0E, 0x48, - 0x02, 0x2D, 0x6C, 0xFD, 0xFB, 0x87, 0xE9, 0x47, 0x11, 0xED, 0x8C, 0x3E, - 0x2C, 0x03, 0xB9, 0xD7, 0x12, 0x98, 0x24, 0xEA, 0xA6, 0x2A, 0x4B, 0xFF, - 0x0D, 0xD2, 0xD1, 0xCA, 0x40, 0x10, 0xBE, 0xB8, 0x34, 0x96, 0xC4, 0x4D, - 0xED, 0xD2, 0x61, 0x76, 0x26, 0xBD, 0x43, 0xD6, 0x01, 0xA5, 0x17, 0x2D, - 0xD5, 0x57, 0x9A, 0xF6, 0x7C, 0x47, 0xD6, 0x37, 0xBE, 0x09, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xA3, 0x50, 0x30, 0x4E, 0x30, 0x1D, 0x06, 0x03, 0x55, - 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x92, 0x0D, 0xAD, 0xDF, 0x06, 0x80, - 0xFC, 0xFF, 0xC7, 0x60, 0x31, 0x1E, 0x6D, 0x04, 0xBF, 0xE8, 0xD6, 0xD6, - 0xAF, 0x21, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, - 0x16, 0x80, 0x14, 0x92, 0x0D, 0xAD, 0xDF, 0x06, 0x80, 0xFC, 0xFF, 0xC7, - 0x60, 0x31, 0x1E, 0x6D, 0x04, 0xBF, 0xE8, 0xD6, 0xD6, 0xAF, 0x21, 0x30, - 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, - 0xFF, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, - 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xA4, 0x8B, 0xD8, - 0x14, 0xDF, 0xAE, 0x7C, 0x39, 0x2A, 0x88, 0x66, 0x30, 0x67, 0x28, 0x17, - 0xE2, 0xEA, 0x36, 0xCA, 0xC0, 0x04, 0xDD, 0x0B, 0x6B, 0xBB, 0x0B, 0x05, - 0x9E, 0x76, 0xB4, 0xF9, 0xAB, 0x1A, 0xB7, 0xF4, 0xCD, 0x96, 0xB1, 0x62, - 0xBE, 0x27, 0xFD, 0xA4, 0x45, 0xB9, 0xD2, 0x91, 0xE7, 0x65, 0x5D, 0xBE, - 0x59, 0x9B, 0x5E, 0xFC, 0xB8, 0x1E, 0x99, 0xE4, 0xB0, 0x4A, 0xA1, 0x9E, - 0x91, 0x54, 0x98, 0x1B, 0x36, 0xDE, 0x65, 0xC8, 0xAE, 0x39, 0xDA, 0xE7, - 0xC1, 0xA7, 0x72, 0x06, 0xA1, 0x89, 0xA0, 0xB4, 0xC1, 0xF8, 0x98, 0xC9, - 0x44, 0x9A, 0x9D, 0x95, 0x54, 0x7E, 0x3A, 0xB5, 0x66, 0x7B, 0x42, 0x76, - 0xAC, 0x16, 0x64, 0x43, 0xCE, 0x7F, 0x2D, 0x90, 0x19, 0xF1, 0x7A, 0x0B, - 0x0C, 0xFA, 0x29, 0x83, 0xEF, 0xA7, 0x53, 0x7E, 0x4D, 0x04, 0x42, 0xB9, - 0xA8, 0x89, 0x84, 0x5B, 0x25, 0x09, 0x6F, 0x54, 0xCF, 0x51, 0x96, 0xD5, - 0x29, 0x0B, 0xB8, 0x68, 0xF8, 0xBD, 0x02, 0xBA, 0x6B, 0x0E, 0x70, 0xDD, - 0xEB, 0x65, 0x32, 0x36, 0x20, 0xD6, 0xBC, 0x7C, 0x7D, 0xC9, 0x1D, 0xA1, - 0x0D, 0xBF, 0x68, 0x23, 0x98, 0xD5, 0x9C, 0xC1, 0xCD, 0x2D, 0x20, 0xAB, - 0x0F, 0x66, 0xDA, 0x05, 0x59, 0x2D, 0x17, 0x03, 0xE0, 0x27, 0x68, 0x1D, - 0x9C, 0xF5, 0xCE, 0xCE, 0x15, 0x87, 0x68, 0xB5, 0x4A, 0xCE, 0x5F, 0xBB, - 0x4C, 0xC8, 0xC8, 0xC4, 0xB3, 0xFA, 0xB9, 0xEA, 0x65, 0xEE, 0xB8, 0x34, - 0x3F, 0xA8, 0xF4, 0x50, 0x26, 0x2D, 0xED, 0xD4, 0x93, 0x2E, 0x56, 0xF4, - 0xEB, 0x08, 0xB4, 0xCD, 0x6A, 0x54, 0x54, 0x4A, 0xE9, 0x3F, 0xEB, 0x06, - 0x39, 0x76, 0x0B, 0x0C, 0xB7, 0xE5, 0xB3, 0xE1, 0x30, 0xA1, 0xF7, 0x7D, - 0x31, 0x84, 0x21, 0x64, 0xD3, 0xC5, 0xC3, 0xEE, 0x8B, 0xCE, 0xEC, 0x16, - 0x08 + 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xB3, 0xE8, 0x6B, 0xAF, 0x9C, 0x16, + 0x52, 0xE3, 0x81, 0x0C, 0x50, 0xAB, 0x25, 0xCE, 0xCC, 0x0D, 0xC7, 0xF2, + 0x1F, 0x7F, 0x50, 0xDF, 0x2C, 0x5C, 0x35, 0xD6, 0x62, 0x2E, 0x63, 0x27, + 0x41, 0xA7, 0xE4, 0x53, 0xA8, 0x4B, 0x27, 0xFA, 0x13, 0x91, 0xA3, 0xFA, + 0x09, 0x4A, 0x2F, 0x3B, 0x5E, 0xCF, 0x77, 0xB3, 0x8A, 0xC1, 0xCD, 0x49, + 0x95, 0x9C, 0x75, 0x0D, 0x64, 0x74, 0xEF, 0xE4, 0xD7, 0x4B, 0xB9, 0xA1, + 0x9B, 0x68, 0xD2, 0x30, 0x71, 0x48, 0xEA, 0xF7, 0x4B, 0x14, 0xDF, 0x3F, + 0x47, 0xA9, 0xD8, 0xBB, 0xEC, 0x8F, 0x28, 0xCC, 0xFA, 0xDF, 0xB4, 0x1F, + 0x94, 0x7C, 0x96, 0xFC, 0x08, 0x05, 0x28, 0xF9, 0xE8, 0xF4, 0x2F, 0x2F, + 0xEE, 0x62, 0x9C, 0x8A, 0x3A, 0xE0, 0x85, 0x58, 0x60, 0xB6, 0x0F, 0x2D, + 0x30, 0xB4, 0xC0, 0x41, 0x54, 0x91, 0x4C, 0x1F, 0x5F, 0xAD, 0xF1, 0x19, + 0xF0, 0xC0, 0x22, 0xA6, 0x7D, 0xD8, 0x3F, 0x79, 0x34, 0x59, 0x42, 0x7B, + 0x5B, 0xB5, 0x41, 0xC4, 0x64, 0x7F, 0x52, 0xCF, 0x3C, 0x37, 0x22, 0xA1, + 0x2F, 0x79, 0x25, 0x94, 0x24, 0x41, 0xC2, 0x3F, 0xFA, 0xC7, 0x75, 0xFB, + 0x48, 0xB5, 0x0D, 0x18, 0xA7, 0xF4, 0x54, 0xF3, 0x2E, 0x6E, 0xD8, 0x43, + 0x58, 0xC4, 0xAB, 0x50, 0xE8, 0x05, 0xAD, 0x91, 0xB6, 0x1E, 0x01, 0x75, + 0xB3, 0x54, 0x9C, 0xDE, 0xA0, 0x99, 0x15, 0xFB, 0xAC, 0xF1, 0x5C, 0x97, + 0x49, 0x51, 0xCC, 0xEF, 0x58, 0x12, 0x6F, 0x73, 0x6B, 0xB3, 0x34, 0x14, + 0x01, 0x0F, 0x5A, 0x9D, 0xFA, 0xAA, 0xD6, 0x93, 0xD3, 0xE2, 0xEA, 0xC3, + 0xAB, 0xBC, 0x4E, 0xED, 0xCC, 0x51, 0xA1, 0xB8, 0xF8, 0x94, 0xB6, 0xB4, + 0x2C, 0xA8, 0x86, 0x2B, 0x1F, 0xF6, 0x51, 0x43, 0x29, 0x52, 0x5E, 0x13, + 0x89, 0xB3, 0x6A, 0x78, 0x60, 0x4E, 0x4E, 0xC0, 0x1B, 0xA5, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xA3, 0x63, 0x30, 0x61, 0x30, 0x1F, 0x06, 0x03, 0x55, + 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xC3, 0x0A, 0xBC, 0xB4, + 0x90, 0x63, 0x96, 0x92, 0x45, 0xBC, 0x27, 0xA0, 0xF0, 0x58, 0x89, 0x2A, + 0xD5, 0x78, 0x00, 0x12, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, + 0x16, 0x04, 0x14, 0x7C, 0xCF, 0xA3, 0xC6, 0x29, 0xF7, 0xF3, 0xC5, 0xAA, + 0x19, 0xD0, 0xC0, 0x16, 0xEB, 0xE0, 0x40, 0x0F, 0xCE, 0x44, 0xA7, 0x30, + 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, + 0x02, 0x00, 0x86, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, + 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x0D, 0x06, 0x09, + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x01, 0x00, 0x54, 0x3B, 0xF4, 0xEA, 0xC6, 0xE4, 0xE8, 0xC0, + 0x5B, 0x12, 0xB2, 0xAD, 0xFA, 0xBD, 0xA9, 0xF4, 0x62, 0x03, 0xAD, 0x57, + 0x4C, 0x6F, 0x07, 0xA7, 0x47, 0x35, 0x75, 0x3E, 0x48, 0xA2, 0x5B, 0x71, + 0x10, 0x01, 0x8F, 0x93, 0x99, 0x9D, 0xA7, 0x47, 0xE3, 0x8E, 0x3E, 0xAF, + 0x2D, 0xBA, 0x06, 0xFE, 0xD4, 0xE4, 0x97, 0xBC, 0x10, 0x8D, 0xA6, 0xA5, + 0x3A, 0x3C, 0xE6, 0x21, 0xCB, 0x3B, 0xDA, 0x13, 0xE3, 0x4A, 0x23, 0xEB, + 0xBC, 0xBA, 0xA5, 0x90, 0x91, 0xAD, 0x55, 0x6E, 0xD5, 0xDD, 0x85, 0x4B, + 0x6B, 0x27, 0xD2, 0x39, 0x76, 0x06, 0x2E, 0xD4, 0x23, 0x5B, 0xBB, 0x55, + 0xB5, 0x49, 0x3F, 0x7D, 0x2F, 0x21, 0xCB, 0x96, 0x75, 0x19, 0x99, 0xA9, + 0x99, 0xF1, 0x0B, 0xBB, 0x3E, 0xC7, 0x10, 0xA7, 0x8B, 0x7A, 0x52, 0xB9, + 0x49, 0xE4, 0x14, 0x08, 0x78, 0xE7, 0x3D, 0xD9, 0x98, 0x57, 0xDA, 0xFF, + 0xDA, 0xB9, 0x8D, 0x66, 0x75, 0x80, 0xB5, 0x5D, 0xB9, 0xDF, 0x69, 0x65, + 0xDB, 0x16, 0xE7, 0x1E, 0xC4, 0x40, 0xE4, 0x46, 0x8A, 0x1E, 0x76, 0x32, + 0x16, 0xE7, 0x83, 0x67, 0xDA, 0x78, 0x56, 0xAB, 0x0F, 0x4C, 0x5C, 0xF1, + 0x70, 0xDA, 0x66, 0x20, 0xF4, 0xF8, 0x0F, 0xF6, 0xDC, 0x2F, 0x72, 0x97, + 0x6B, 0x78, 0x40, 0x79, 0x9D, 0x5B, 0x6D, 0xBE, 0x03, 0xCE, 0x70, 0x42, + 0xA8, 0x2A, 0x71, 0x11, 0xDF, 0x2E, 0x81, 0x01, 0xEA, 0x86, 0x12, 0x91, + 0x4F, 0xD0, 0x18, 0xED, 0x84, 0xA4, 0x48, 0x30, 0xB9, 0xB9, 0x7B, 0x56, + 0x3E, 0xEF, 0x8D, 0xE1, 0x1F, 0xFD, 0x90, 0xB2, 0x44, 0x85, 0x58, 0x6F, + 0xA7, 0x30, 0x74, 0x7C, 0xF1, 0xAE, 0x8C, 0x99, 0x3F, 0xF1, 0x4D, 0x57, + 0xC5, 0x95, 0x68, 0xC2, 0x36, 0xB2, 0xEC, 0xC2, 0x68, 0x7A, 0xC0, 0x81, + 0xA9, 0x55, 0x05, 0xE7, 0xCF, 0xAF, 0x50, 0xAC }; static const br_x509_certificate SERVER_CERTIFICATE_CHAIN[] = { - { (unsigned char *)CERT0, sizeof CERT0 } + { (unsigned char *)CERT0, sizeof CERT0 }, + { (unsigned char *)CERT1, sizeof CERT1 } }; -#define SERVER_CERTIFICATE_CHAIN_LEN 1 \ No newline at end of file +#define SERVER_CERTIFICATE_CHAIN_LEN 2 diff --git a/examples/tls_server_bearssl/key.h b/examples/tls_server_bearssl/key.h index 46ab3fa..41c6b28 100644 --- a/examples/tls_server_bearssl/key.h +++ b/examples/tls_server_bearssl/key.h @@ -1,78 +1,101 @@ +/* + * Copyright (c) 2016 Thomas Pornin + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + #include "bearssl.h" /* - * Server private key - * Generated using ./brssl skey -c key.pem + * The private key for the server certificate (RSA). */ static const unsigned char RSA_P[] = { - 0xD5, 0xE0, 0xC5, 0xAB, 0xDA, 0xA1, 0x32, 0x6C, 0x4A, 0x35, 0x4B, 0x44, - 0x2B, 0x87, 0xBD, 0xBB, 0xDD, 0x31, 0x60, 0xD8, 0x52, 0x74, 0xA4, 0x15, - 0xFD, 0x7C, 0x97, 0xA7, 0xE1, 0x64, 0xD1, 0xA4, 0x86, 0xB8, 0x37, 0x63, - 0x2C, 0x99, 0xBE, 0xAB, 0x58, 0xB6, 0x28, 0x3E, 0x91, 0x7D, 0xBB, 0xB1, - 0x0B, 0x2E, 0x35, 0x54, 0xF3, 0x6C, 0xFC, 0x43, 0xA5, 0xA7, 0xA9, 0x8F, - 0xF9, 0xF0, 0x93, 0x0D, 0x54, 0xAB, 0x04, 0xB9, 0x0E, 0x4B, 0xF7, 0x76, - 0x0E, 0x26, 0xFF, 0xD1, 0x75, 0xA2, 0xDE, 0x8F, 0xCD, 0xA7, 0xA6, 0x41, - 0xF4, 0xF6, 0x5B, 0x53, 0xCB, 0x57, 0xAA, 0xA2, 0x9C, 0x68, 0xA9, 0xA4, - 0x85, 0x33, 0x88, 0xFC, 0xFD, 0xDC, 0xFB, 0x80, 0x29, 0xDB, 0x17, 0xC3, - 0x06, 0xD3, 0x7F, 0x18, 0x17, 0xB9, 0x0D, 0x13, 0xBB, 0x36, 0x7E, 0xB4, - 0xBD, 0xAD, 0xC0, 0xD1, 0xC4, 0x85, 0xD9, 0xF1 + 0xF9, 0xF6, 0x32, 0x9C, 0x51, 0xD7, 0x71, 0xB2, 0x62, 0xED, 0x81, 0x24, + 0xDA, 0xF6, 0xA9, 0x2C, 0xC3, 0x2D, 0x55, 0x94, 0x95, 0x51, 0xE5, 0x36, + 0x12, 0x9E, 0x2E, 0x1F, 0x8E, 0xD8, 0x22, 0x22, 0x64, 0x5E, 0xA3, 0xFC, + 0x60, 0xF0, 0x14, 0xDC, 0x10, 0x48, 0x6F, 0x4F, 0x1A, 0x7D, 0xCC, 0x37, + 0x23, 0x27, 0x76, 0xB6, 0x31, 0xAA, 0xDE, 0x70, 0xC9, 0xEC, 0xAB, 0x0A, + 0x50, 0xF1, 0xEA, 0x79, 0x79, 0x74, 0xBE, 0x3B, 0xAB, 0x2E, 0x63, 0x97, + 0xA2, 0x6F, 0x0A, 0x45, 0x7B, 0xD7, 0x6C, 0xD2, 0x6D, 0x1B, 0x70, 0x31, + 0x03, 0xAF, 0x26, 0x8B, 0x28, 0xC5, 0xF8, 0x49, 0x67, 0x45, 0x41, 0xF1, + 0xD3, 0x35, 0x05, 0x27, 0x2A, 0x79, 0x21, 0xDA, 0x06, 0xB6, 0x3D, 0xA2, + 0xE8, 0x3C, 0x40, 0xFA, 0x6F, 0xC4, 0xFC, 0xF5, 0xC4, 0x05, 0xEB, 0x9A, + 0x31, 0xAA, 0x40, 0x7E, 0x5E, 0xEE, 0x22, 0x5B }; static const unsigned char RSA_Q[] = { - 0xCD, 0xBF, 0x7E, 0x90, 0x59, 0xC4, 0x7F, 0x5D, 0xD7, 0x1A, 0xF9, 0x39, - 0xDB, 0xDC, 0x20, 0x0D, 0xB9, 0x77, 0xB4, 0x7B, 0x0D, 0xAC, 0x74, 0x59, - 0x39, 0x6F, 0x9F, 0x04, 0xDB, 0x7F, 0xE4, 0x3F, 0x87, 0xF0, 0xAC, 0xB8, - 0x9B, 0x51, 0xE4, 0x7A, 0x39, 0x36, 0xF2, 0xAE, 0xFB, 0x7C, 0x24, 0x0F, - 0x46, 0xF7, 0xF4, 0x2D, 0xE3, 0x4A, 0x09, 0x6A, 0xBF, 0xAC, 0x32, 0xE3, - 0x8E, 0x40, 0xBB, 0x10, 0x1E, 0x61, 0x0F, 0x3B, 0x47, 0x5C, 0x57, 0xF4, - 0xA6, 0xD3, 0x4B, 0xC8, 0xE5, 0x67, 0x87, 0x5E, 0xA1, 0x4A, 0xCE, 0x01, - 0xAF, 0x32, 0xDE, 0x6D, 0xFB, 0x12, 0xA8, 0xC0, 0x98, 0x81, 0x61, 0xB1, - 0x18, 0x97, 0xB7, 0xB9, 0xDC, 0x66, 0xFB, 0x03, 0xE7, 0x30, 0x0E, 0x6D, - 0x7F, 0x4A, 0xC0, 0x4D, 0x8D, 0x81, 0xD3, 0x09, 0x59, 0xF7, 0x47, 0xB0, - 0xA6, 0x38, 0xCA, 0xE4, 0x17, 0x5B, 0x4D, 0x99 + 0xD9, 0x9C, 0x1A, 0xDC, 0x94, 0x51, 0xF6, 0xC1, 0x96, 0xDA, 0x0E, 0x11, + 0x3F, 0x37, 0x28, 0x7A, 0x33, 0xB0, 0xC4, 0xBE, 0xDF, 0x68, 0x2B, 0xD3, + 0x1C, 0x65, 0x67, 0x7A, 0x3C, 0xAF, 0x59, 0x50, 0xAB, 0x29, 0x36, 0x17, + 0x39, 0x15, 0x71, 0x97, 0x62, 0xDD, 0xCD, 0x25, 0xEE, 0x8D, 0xFF, 0x26, + 0x8F, 0x71, 0x21, 0xBE, 0x8F, 0x9C, 0x85, 0x4E, 0x3A, 0xE1, 0x24, 0xC7, + 0xE1, 0x4A, 0xDF, 0xD0, 0x60, 0xB3, 0xC4, 0x44, 0x2E, 0xAC, 0x73, 0x16, + 0x5F, 0x07, 0xC9, 0x3A, 0x73, 0x5E, 0xDA, 0x9B, 0xEE, 0xE2, 0xB4, 0xA9, + 0x3D, 0x33, 0x14, 0x7B, 0xEE, 0xA7, 0xD4, 0xAC, 0xF7, 0x53, 0xE6, 0x3E, + 0xF0, 0x85, 0x57, 0x4C, 0x8B, 0x96, 0x1B, 0xDD, 0xD7, 0x36, 0xFC, 0x89, + 0x37, 0x59, 0x75, 0x96, 0x75, 0x8B, 0x2E, 0xF7, 0x04, 0x2D, 0x29, 0x89, + 0xD9, 0xB7, 0x9F, 0x71, 0x3B, 0xE2, 0xED, 0xC7 }; static const unsigned char RSA_DP[] = { - 0x34, 0xCC, 0xB7, 0x9F, 0xF4, 0x6A, 0x45, 0x1B, 0x6C, 0xBA, 0x79, 0x69, - 0x4B, 0xE1, 0xC7, 0xDA, 0x40, 0x01, 0xF7, 0xA9, 0x8F, 0xB9, 0x91, 0xE4, - 0x87, 0xDE, 0xA1, 0x45, 0xE5, 0xA3, 0xD1, 0x09, 0x6F, 0xE4, 0xBC, 0x6F, - 0xB4, 0x4C, 0x04, 0x41, 0x22, 0xB6, 0x5D, 0x7B, 0x0C, 0xC9, 0xE0, 0x73, - 0x15, 0x92, 0x83, 0xC2, 0x04, 0x12, 0x4C, 0xB8, 0x9A, 0x85, 0xA8, 0x9B, - 0x8D, 0x95, 0x71, 0x88, 0x21, 0xF5, 0xD2, 0x45, 0xA9, 0x1C, 0xE1, 0xEB, - 0x78, 0x14, 0xF2, 0xA4, 0x90, 0x08, 0xF4, 0x2E, 0xC6, 0x13, 0x74, 0x3C, - 0xE6, 0x2F, 0x87, 0x5E, 0x49, 0x5D, 0xCC, 0x17, 0x36, 0xCB, 0xB3, 0xCD, - 0x94, 0xC0, 0xA3, 0x39, 0xE9, 0xA6, 0x0B, 0x44, 0x99, 0x90, 0xA7, 0xEE, - 0x12, 0x9A, 0x55, 0xCE, 0xE9, 0xD4, 0x5A, 0x41, 0x1B, 0xBF, 0x99, 0x4A, - 0x1F, 0x65, 0x6C, 0xAB, 0x9C, 0x7B, 0x7A, 0xD1 + 0xE4, 0xFC, 0x02, 0x2F, 0x2B, 0xD6, 0x47, 0x04, 0xD9, 0x15, 0xA4, 0x5A, + 0x23, 0xF1, 0x14, 0xD7, 0xB9, 0xD1, 0x1C, 0xF6, 0x29, 0xB8, 0x45, 0x57, + 0x3C, 0xC5, 0x05, 0x91, 0xC9, 0x64, 0xFC, 0x18, 0x2F, 0x84, 0x77, 0x8B, + 0x6B, 0x2E, 0x64, 0x9D, 0x98, 0x99, 0x12, 0xC7, 0x0F, 0x88, 0xB0, 0x7C, + 0xCE, 0x4A, 0x87, 0xB8, 0xAE, 0x55, 0x4E, 0xC3, 0x5A, 0x67, 0xE1, 0xE4, + 0x68, 0x74, 0xC5, 0x8D, 0x14, 0x93, 0xBA, 0xF5, 0xA4, 0x82, 0xB1, 0x9F, + 0xA6, 0xA1, 0x3C, 0x72, 0x9C, 0xD9, 0xA3, 0x8A, 0x3D, 0x83, 0x86, 0x4A, + 0x90, 0x8A, 0x72, 0xAF, 0xC6, 0xE1, 0x5C, 0xEB, 0xB9, 0x9C, 0x3B, 0xA6, + 0x12, 0x0B, 0x1F, 0x36, 0x5A, 0xF5, 0x6E, 0xEA, 0x71, 0x7D, 0x9F, 0x87, + 0x4E, 0x62, 0x6C, 0x50, 0x3F, 0xF5, 0xE0, 0x9A, 0x30, 0x42, 0x10, 0x2C, + 0x48, 0x55, 0x24, 0x11, 0xE0, 0x5B, 0x1C, 0xC3 }; static const unsigned char RSA_DQ[] = { - 0x82, 0xE5, 0xE5, 0x00, 0xB3, 0x8B, 0xD7, 0x38, 0x7D, 0xA4, 0xF4, 0x90, - 0xC1, 0xF7, 0x0F, 0x11, 0x8C, 0x40, 0xC3, 0x3B, 0x52, 0x9C, 0xB8, 0x3D, - 0x17, 0xD4, 0x93, 0x08, 0x05, 0x1A, 0x1D, 0xBD, 0xE9, 0x9F, 0xCE, 0x53, - 0x78, 0xC5, 0xA6, 0x25, 0xB8, 0x86, 0xE3, 0xE9, 0x3D, 0xA8, 0x62, 0x4C, - 0xB1, 0xEB, 0x08, 0x97, 0xB5, 0x36, 0x22, 0x3D, 0x9F, 0x0A, 0x50, 0x2A, - 0x04, 0x13, 0xDC, 0xAF, 0x49, 0x94, 0x98, 0x9B, 0x2F, 0x30, 0x69, 0xE9, - 0x05, 0xC6, 0x02, 0x3E, 0x22, 0xED, 0x35, 0xEB, 0x97, 0x94, 0x3E, 0xF2, - 0x45, 0x63, 0x88, 0xAD, 0xD2, 0x01, 0xB2, 0x09, 0x2E, 0x3D, 0x8A, 0x48, - 0xA0, 0x8B, 0xCD, 0xE0, 0xDA, 0x7F, 0x4E, 0x0D, 0xD2, 0xA4, 0xF9, 0x58, - 0xE2, 0x96, 0x4D, 0x38, 0x49, 0xE2, 0x21, 0xC0, 0x9E, 0x53, 0x3B, 0x72, - 0x00, 0x9E, 0xBB, 0x3E, 0x58, 0x39, 0xC7, 0x69 + 0x8D, 0xAC, 0xE0, 0xA0, 0x33, 0xC0, 0x99, 0x52, 0xB8, 0x90, 0x07, 0x10, + 0x9B, 0x83, 0xA1, 0xCA, 0xCD, 0xD4, 0x8C, 0x83, 0x68, 0x98, 0x3D, 0xD0, + 0x18, 0x70, 0xBC, 0xCA, 0x0C, 0xB0, 0x6D, 0x09, 0xE4, 0x25, 0xD4, 0x9D, + 0x92, 0x00, 0xB0, 0x0F, 0xCB, 0xC2, 0x74, 0x49, 0xF9, 0xE2, 0x60, 0xF8, + 0x0D, 0xF3, 0xAD, 0xF0, 0x8F, 0x37, 0x6C, 0x62, 0xDE, 0x5A, 0xAE, 0xC3, + 0xA3, 0x9E, 0x47, 0xD1, 0x36, 0xE4, 0x53, 0x27, 0xC0, 0xEB, 0x6D, 0x92, + 0x67, 0x14, 0x7E, 0xA2, 0x9B, 0x72, 0x6A, 0x09, 0x93, 0xA1, 0xED, 0xD5, + 0x31, 0x8F, 0x0C, 0x0B, 0x13, 0xFA, 0x18, 0xB0, 0xF3, 0xE5, 0x9F, 0xC5, + 0xE2, 0x7A, 0x2D, 0xB8, 0x1C, 0x39, 0x02, 0xB3, 0x8F, 0xE6, 0xB0, 0xCB, + 0xF5, 0x49, 0x3D, 0x11, 0x54, 0x3D, 0xE5, 0xB9, 0xD4, 0xF2, 0x42, 0x55, + 0x09, 0x76, 0x4F, 0x4C, 0x3D, 0x9D, 0x25, 0x09 }; static const unsigned char RSA_IQ[] = { - 0x2E, 0x70, 0x40, 0x8D, 0xF9, 0xC6, 0xB8, 0x49, 0x28, 0x3D, 0x76, 0x48, - 0x8D, 0x8F, 0x54, 0x57, 0x57, 0xDF, 0xEE, 0x56, 0x50, 0x42, 0x09, 0xE5, - 0x28, 0xAF, 0xBB, 0x9A, 0xF6, 0x6B, 0x99, 0xCF, 0x63, 0xE1, 0x1E, 0xD8, - 0x7E, 0x4D, 0xBA, 0x15, 0x9F, 0xEF, 0x8D, 0x95, 0x14, 0x08, 0x3A, 0x60, - 0x27, 0xCA, 0xD7, 0x26, 0x2E, 0x2B, 0x6B, 0xFF, 0xBC, 0x9F, 0xE1, 0x68, - 0xB8, 0x99, 0xA8, 0x16, 0x5E, 0xDC, 0x5E, 0x81, 0xD1, 0x40, 0x5F, 0x42, - 0x7C, 0xD4, 0xB5, 0x56, 0xDE, 0x9C, 0xD9, 0x62, 0x2E, 0x3E, 0xB4, 0x49, - 0xB0, 0x6F, 0x7B, 0x72, 0x0D, 0x0E, 0x04, 0xF0, 0xD9, 0xA6, 0xE6, 0xD2, - 0xFD, 0xC3, 0x73, 0x1E, 0x30, 0x6C, 0xC4, 0xFC, 0xC3, 0x64, 0xA1, 0x88, - 0x2F, 0x37, 0xED, 0x1A, 0xF4, 0x9D, 0x48, 0x46, 0xB3, 0x42, 0x14, 0x6B, - 0x25, 0x39, 0x74, 0xBA, 0x5D, 0xDE, 0xA0, 0x75 + 0x72, 0x0C, 0xA7, 0xCF, 0x06, 0x95, 0x69, 0xF4, 0x75, 0x20, 0x34, 0x03, + 0xE0, 0xCF, 0x9A, 0x51, 0x93, 0xF5, 0x42, 0x2E, 0xF2, 0x85, 0xBE, 0xCE, + 0x4F, 0x38, 0xB5, 0x8C, 0xA2, 0x99, 0x42, 0xF3, 0xBD, 0x65, 0x38, 0xE2, + 0x34, 0x3F, 0x21, 0x9D, 0xF5, 0xBD, 0xB3, 0xBF, 0x73, 0x3C, 0x18, 0xDE, + 0xF6, 0xF0, 0x7F, 0xA1, 0xC2, 0x55, 0xF2, 0x38, 0xE9, 0x0E, 0x1E, 0x31, + 0xE7, 0xDB, 0x51, 0xC5, 0x71, 0x8D, 0x67, 0x71, 0x3A, 0x9F, 0x55, 0x52, + 0x60, 0xEE, 0x45, 0xF6, 0x08, 0x98, 0x81, 0xB7, 0x7B, 0x2F, 0xF2, 0x96, + 0x7D, 0x73, 0xD0, 0xA6, 0xAB, 0xAA, 0x83, 0x49, 0x41, 0x35, 0xA9, 0x90, + 0x67, 0xCE, 0xD3, 0xB9, 0x73, 0x54, 0xAA, 0x84, 0x00, 0x88, 0x88, 0x90, + 0x1D, 0x86, 0x9B, 0xE5, 0xB8, 0xCE, 0x89, 0x0A, 0x1B, 0x47, 0x62, 0x31, + 0xC2, 0x3F, 0xC3, 0x8C, 0x86, 0x09, 0x3C, 0x86 }; static const br_rsa_private_key SERVER_PRIVATE_KEY = { diff --git a/extras/bearssl/BearSSL b/extras/bearssl/BearSSL index 6b4cd86..f0c0046 160000 --- a/extras/bearssl/BearSSL +++ b/extras/bearssl/BearSSL @@ -1 +1 @@ -Subproject commit 6b4cd8609450f294071b38f478bec3b6b8c48ce5 +Subproject commit f0c00466018e4bcdaa2d965ac723d53f015cde9a