Update to latest BearSSL version

- Update subrepository to latest BearSSL version
- Use full certificate chain verification
- Add Let's-Encrypt root certificate (IdenTrust cross-signed)
- Add workaround for missing date & time (use time of compilation for SSL)
- Add updated certificates for tls_server_bearssl example from BearSSL server example,
  previous ones were expired
This commit is contained in:
Milosch Meriac 2017-02-13 00:47:30 +00:00
parent c66730960e
commit 48e129dcc4
5 changed files with 347 additions and 194 deletions

View file

@ -1,4 +1,6 @@
PROGRAM=http_get_bearssl
EXTRA_COMPONENTS = extras/bearssl
EXTRA_CFLAGS +=-DCONFIG_EPOCH_TIME=$(shell date --utc '+%s')
include ../../common.mk

View file

@ -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);

View file

@ -1,97 +1,183 @@
/*
* Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
*
* 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
#define SERVER_CERTIFICATE_CHAIN_LEN 2

View file

@ -1,78 +1,101 @@
/*
* Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
*
* 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 = {

@ -1 +1 @@
Subproject commit 6b4cd8609450f294071b38f478bec3b6b8c48ce5
Subproject commit f0c00466018e4bcdaa2d965ac723d53f015cde9a