1*e0c4386eSCy Schubert /* 2*e0c4386eSCy Schubert * Copyright 2016-2022 The OpenSSL Project Authors. All Rights Reserved. 3*e0c4386eSCy Schubert * 4*e0c4386eSCy Schubert * Licensed under the Apache License 2.0 (the "License"). You may not use 5*e0c4386eSCy Schubert * this file except in compliance with the License. You can obtain a copy 6*e0c4386eSCy Schubert * in the file LICENSE in the source distribution or at 7*e0c4386eSCy Schubert * https://www.openssl.org/source/license.html 8*e0c4386eSCy Schubert */ 9*e0c4386eSCy Schubert 10*e0c4386eSCy Schubert #include <ctype.h> 11*e0c4386eSCy Schubert #include <stdio.h> 12*e0c4386eSCy Schubert #include <stdlib.h> 13*e0c4386eSCy Schubert #include <string.h> 14*e0c4386eSCy Schubert 15*e0c4386eSCy Schubert #include <openssl/ct.h> 16*e0c4386eSCy Schubert #include <openssl/err.h> 17*e0c4386eSCy Schubert #include <openssl/pem.h> 18*e0c4386eSCy Schubert #include <openssl/x509.h> 19*e0c4386eSCy Schubert #include <openssl/x509v3.h> 20*e0c4386eSCy Schubert #include "testutil.h" 21*e0c4386eSCy Schubert #include <openssl/crypto.h> 22*e0c4386eSCy Schubert 23*e0c4386eSCy Schubert #ifndef OPENSSL_NO_CT 24*e0c4386eSCy Schubert 25*e0c4386eSCy Schubert /* Used when declaring buffers to read text files into */ 26*e0c4386eSCy Schubert # define CT_TEST_MAX_FILE_SIZE 8096 27*e0c4386eSCy Schubert 28*e0c4386eSCy Schubert static char *certs_dir = NULL; 29*e0c4386eSCy Schubert static char *ct_dir = NULL; 30*e0c4386eSCy Schubert 31*e0c4386eSCy Schubert typedef struct ct_test_fixture { 32*e0c4386eSCy Schubert const char *test_case_name; 33*e0c4386eSCy Schubert /* The current time in milliseconds */ 34*e0c4386eSCy Schubert uint64_t epoch_time_in_ms; 35*e0c4386eSCy Schubert /* The CT log store to use during tests */ 36*e0c4386eSCy Schubert CTLOG_STORE* ctlog_store; 37*e0c4386eSCy Schubert /* Set the following to test handling of SCTs in X509 certificates */ 38*e0c4386eSCy Schubert const char *certs_dir; 39*e0c4386eSCy Schubert char *certificate_file; 40*e0c4386eSCy Schubert char *issuer_file; 41*e0c4386eSCy Schubert /* Expected number of SCTs */ 42*e0c4386eSCy Schubert int expected_sct_count; 43*e0c4386eSCy Schubert /* Expected number of valid SCTS */ 44*e0c4386eSCy Schubert int expected_valid_sct_count; 45*e0c4386eSCy Schubert /* Set the following to test handling of SCTs in TLS format */ 46*e0c4386eSCy Schubert const unsigned char *tls_sct_list; 47*e0c4386eSCy Schubert size_t tls_sct_list_len; 48*e0c4386eSCy Schubert STACK_OF(SCT) *sct_list; 49*e0c4386eSCy Schubert /* 50*e0c4386eSCy Schubert * A file to load the expected SCT text from. 51*e0c4386eSCy Schubert * This text will be compared to the actual text output during the test. 52*e0c4386eSCy Schubert * A maximum of |CT_TEST_MAX_FILE_SIZE| bytes will be read of this file. 53*e0c4386eSCy Schubert */ 54*e0c4386eSCy Schubert const char *sct_dir; 55*e0c4386eSCy Schubert const char *sct_text_file; 56*e0c4386eSCy Schubert /* Whether to test the validity of the SCT(s) */ 57*e0c4386eSCy Schubert int test_validity; 58*e0c4386eSCy Schubert } CT_TEST_FIXTURE; 59*e0c4386eSCy Schubert 60*e0c4386eSCy Schubert static CT_TEST_FIXTURE *set_up(const char *const test_case_name) 61*e0c4386eSCy Schubert { 62*e0c4386eSCy Schubert CT_TEST_FIXTURE *fixture = NULL; 63*e0c4386eSCy Schubert 64*e0c4386eSCy Schubert if (!TEST_ptr(fixture = OPENSSL_zalloc(sizeof(*fixture)))) 65*e0c4386eSCy Schubert goto end; 66*e0c4386eSCy Schubert fixture->test_case_name = test_case_name; 67*e0c4386eSCy Schubert fixture->epoch_time_in_ms = 1580335307000ULL; /* Wed 29 Jan 2020 10:01:47 PM UTC */ 68*e0c4386eSCy Schubert if (!TEST_ptr(fixture->ctlog_store = CTLOG_STORE_new()) 69*e0c4386eSCy Schubert || !TEST_int_eq( 70*e0c4386eSCy Schubert CTLOG_STORE_load_default_file(fixture->ctlog_store), 1)) 71*e0c4386eSCy Schubert goto end; 72*e0c4386eSCy Schubert return fixture; 73*e0c4386eSCy Schubert 74*e0c4386eSCy Schubert end: 75*e0c4386eSCy Schubert if (fixture != NULL) 76*e0c4386eSCy Schubert CTLOG_STORE_free(fixture->ctlog_store); 77*e0c4386eSCy Schubert OPENSSL_free(fixture); 78*e0c4386eSCy Schubert TEST_error("Failed to setup"); 79*e0c4386eSCy Schubert return NULL; 80*e0c4386eSCy Schubert } 81*e0c4386eSCy Schubert 82*e0c4386eSCy Schubert static void tear_down(CT_TEST_FIXTURE *fixture) 83*e0c4386eSCy Schubert { 84*e0c4386eSCy Schubert if (fixture != NULL) { 85*e0c4386eSCy Schubert CTLOG_STORE_free(fixture->ctlog_store); 86*e0c4386eSCy Schubert SCT_LIST_free(fixture->sct_list); 87*e0c4386eSCy Schubert } 88*e0c4386eSCy Schubert OPENSSL_free(fixture); 89*e0c4386eSCy Schubert } 90*e0c4386eSCy Schubert 91*e0c4386eSCy Schubert static X509 *load_pem_cert(const char *dir, const char *file) 92*e0c4386eSCy Schubert { 93*e0c4386eSCy Schubert X509 *cert = NULL; 94*e0c4386eSCy Schubert char *file_path = test_mk_file_path(dir, file); 95*e0c4386eSCy Schubert 96*e0c4386eSCy Schubert if (file_path != NULL) { 97*e0c4386eSCy Schubert BIO *cert_io = BIO_new_file(file_path, "r"); 98*e0c4386eSCy Schubert 99*e0c4386eSCy Schubert if (cert_io != NULL) 100*e0c4386eSCy Schubert cert = PEM_read_bio_X509(cert_io, NULL, NULL, NULL); 101*e0c4386eSCy Schubert BIO_free(cert_io); 102*e0c4386eSCy Schubert } 103*e0c4386eSCy Schubert 104*e0c4386eSCy Schubert OPENSSL_free(file_path); 105*e0c4386eSCy Schubert return cert; 106*e0c4386eSCy Schubert } 107*e0c4386eSCy Schubert 108*e0c4386eSCy Schubert static int read_text_file(const char *dir, const char *file, 109*e0c4386eSCy Schubert char *buffer, int buffer_length) 110*e0c4386eSCy Schubert { 111*e0c4386eSCy Schubert int len = -1; 112*e0c4386eSCy Schubert char *file_path = test_mk_file_path(dir, file); 113*e0c4386eSCy Schubert 114*e0c4386eSCy Schubert if (file_path != NULL) { 115*e0c4386eSCy Schubert BIO *file_io = BIO_new_file(file_path, "r"); 116*e0c4386eSCy Schubert 117*e0c4386eSCy Schubert if (file_io != NULL) 118*e0c4386eSCy Schubert len = BIO_read(file_io, buffer, buffer_length); 119*e0c4386eSCy Schubert BIO_free(file_io); 120*e0c4386eSCy Schubert } 121*e0c4386eSCy Schubert 122*e0c4386eSCy Schubert OPENSSL_free(file_path); 123*e0c4386eSCy Schubert return len; 124*e0c4386eSCy Schubert } 125*e0c4386eSCy Schubert 126*e0c4386eSCy Schubert static int compare_sct_list_printout(STACK_OF(SCT) *sct, 127*e0c4386eSCy Schubert const char *expected_output) 128*e0c4386eSCy Schubert { 129*e0c4386eSCy Schubert BIO *text_buffer = NULL; 130*e0c4386eSCy Schubert char *actual_output = NULL; 131*e0c4386eSCy Schubert int result = 0; 132*e0c4386eSCy Schubert 133*e0c4386eSCy Schubert if (!TEST_ptr(text_buffer = BIO_new(BIO_s_mem()))) 134*e0c4386eSCy Schubert goto end; 135*e0c4386eSCy Schubert 136*e0c4386eSCy Schubert SCT_LIST_print(sct, text_buffer, 0, "\n", NULL); 137*e0c4386eSCy Schubert 138*e0c4386eSCy Schubert /* Append \0 because we're about to use the buffer contents as a string. */ 139*e0c4386eSCy Schubert if (!TEST_true(BIO_write(text_buffer, "\0", 1))) 140*e0c4386eSCy Schubert goto end; 141*e0c4386eSCy Schubert 142*e0c4386eSCy Schubert BIO_get_mem_data(text_buffer, &actual_output); 143*e0c4386eSCy Schubert if (!TEST_str_eq(actual_output, expected_output)) 144*e0c4386eSCy Schubert goto end; 145*e0c4386eSCy Schubert result = 1; 146*e0c4386eSCy Schubert 147*e0c4386eSCy Schubert end: 148*e0c4386eSCy Schubert BIO_free(text_buffer); 149*e0c4386eSCy Schubert return result; 150*e0c4386eSCy Schubert } 151*e0c4386eSCy Schubert 152*e0c4386eSCy Schubert static int compare_extension_printout(X509_EXTENSION *extension, 153*e0c4386eSCy Schubert const char *expected_output) 154*e0c4386eSCy Schubert { 155*e0c4386eSCy Schubert BIO *text_buffer = NULL; 156*e0c4386eSCy Schubert char *actual_output = NULL; 157*e0c4386eSCy Schubert int result = 0; 158*e0c4386eSCy Schubert 159*e0c4386eSCy Schubert if (!TEST_ptr(text_buffer = BIO_new(BIO_s_mem())) 160*e0c4386eSCy Schubert || !TEST_true(X509V3_EXT_print(text_buffer, extension, 161*e0c4386eSCy Schubert X509V3_EXT_DEFAULT, 0))) 162*e0c4386eSCy Schubert goto end; 163*e0c4386eSCy Schubert 164*e0c4386eSCy Schubert /* Append \n because it's easier to create files that end with one. */ 165*e0c4386eSCy Schubert if (!TEST_true(BIO_write(text_buffer, "\n", 1))) 166*e0c4386eSCy Schubert goto end; 167*e0c4386eSCy Schubert 168*e0c4386eSCy Schubert /* Append \0 because we're about to use the buffer contents as a string. */ 169*e0c4386eSCy Schubert if (!TEST_true(BIO_write(text_buffer, "\0", 1))) 170*e0c4386eSCy Schubert goto end; 171*e0c4386eSCy Schubert 172*e0c4386eSCy Schubert BIO_get_mem_data(text_buffer, &actual_output); 173*e0c4386eSCy Schubert if (!TEST_str_eq(actual_output, expected_output)) 174*e0c4386eSCy Schubert goto end; 175*e0c4386eSCy Schubert 176*e0c4386eSCy Schubert result = 1; 177*e0c4386eSCy Schubert 178*e0c4386eSCy Schubert end: 179*e0c4386eSCy Schubert BIO_free(text_buffer); 180*e0c4386eSCy Schubert return result; 181*e0c4386eSCy Schubert } 182*e0c4386eSCy Schubert 183*e0c4386eSCy Schubert static int assert_validity(CT_TEST_FIXTURE *fixture, STACK_OF(SCT) *scts, 184*e0c4386eSCy Schubert CT_POLICY_EVAL_CTX *policy_ctx) 185*e0c4386eSCy Schubert { 186*e0c4386eSCy Schubert int invalid_sct_count = 0; 187*e0c4386eSCy Schubert int valid_sct_count = 0; 188*e0c4386eSCy Schubert int i; 189*e0c4386eSCy Schubert 190*e0c4386eSCy Schubert if (!TEST_int_ge(SCT_LIST_validate(scts, policy_ctx), 0)) 191*e0c4386eSCy Schubert return 0; 192*e0c4386eSCy Schubert 193*e0c4386eSCy Schubert for (i = 0; i < sk_SCT_num(scts); ++i) { 194*e0c4386eSCy Schubert SCT *sct_i = sk_SCT_value(scts, i); 195*e0c4386eSCy Schubert 196*e0c4386eSCy Schubert switch (SCT_get_validation_status(sct_i)) { 197*e0c4386eSCy Schubert case SCT_VALIDATION_STATUS_VALID: 198*e0c4386eSCy Schubert ++valid_sct_count; 199*e0c4386eSCy Schubert break; 200*e0c4386eSCy Schubert case SCT_VALIDATION_STATUS_INVALID: 201*e0c4386eSCy Schubert ++invalid_sct_count; 202*e0c4386eSCy Schubert break; 203*e0c4386eSCy Schubert case SCT_VALIDATION_STATUS_NOT_SET: 204*e0c4386eSCy Schubert case SCT_VALIDATION_STATUS_UNKNOWN_LOG: 205*e0c4386eSCy Schubert case SCT_VALIDATION_STATUS_UNVERIFIED: 206*e0c4386eSCy Schubert case SCT_VALIDATION_STATUS_UNKNOWN_VERSION: 207*e0c4386eSCy Schubert /* Ignore other validation statuses. */ 208*e0c4386eSCy Schubert break; 209*e0c4386eSCy Schubert } 210*e0c4386eSCy Schubert } 211*e0c4386eSCy Schubert 212*e0c4386eSCy Schubert if (!TEST_int_eq(valid_sct_count, fixture->expected_valid_sct_count)) { 213*e0c4386eSCy Schubert int unverified_sct_count = sk_SCT_num(scts) - 214*e0c4386eSCy Schubert invalid_sct_count - valid_sct_count; 215*e0c4386eSCy Schubert 216*e0c4386eSCy Schubert TEST_info("%d SCTs failed, %d SCTs unverified", 217*e0c4386eSCy Schubert invalid_sct_count, unverified_sct_count); 218*e0c4386eSCy Schubert return 0; 219*e0c4386eSCy Schubert } 220*e0c4386eSCy Schubert 221*e0c4386eSCy Schubert return 1; 222*e0c4386eSCy Schubert } 223*e0c4386eSCy Schubert 224*e0c4386eSCy Schubert static int execute_cert_test(CT_TEST_FIXTURE *fixture) 225*e0c4386eSCy Schubert { 226*e0c4386eSCy Schubert int success = 0; 227*e0c4386eSCy Schubert X509 *cert = NULL, *issuer = NULL; 228*e0c4386eSCy Schubert STACK_OF(SCT) *scts = NULL; 229*e0c4386eSCy Schubert SCT *sct = NULL; 230*e0c4386eSCy Schubert char expected_sct_text[CT_TEST_MAX_FILE_SIZE]; 231*e0c4386eSCy Schubert int sct_text_len = 0; 232*e0c4386eSCy Schubert unsigned char *tls_sct_list = NULL; 233*e0c4386eSCy Schubert size_t tls_sct_list_len = 0; 234*e0c4386eSCy Schubert CT_POLICY_EVAL_CTX *ct_policy_ctx = CT_POLICY_EVAL_CTX_new(); 235*e0c4386eSCy Schubert 236*e0c4386eSCy Schubert if (fixture->sct_text_file != NULL) { 237*e0c4386eSCy Schubert sct_text_len = read_text_file(fixture->sct_dir, fixture->sct_text_file, 238*e0c4386eSCy Schubert expected_sct_text, 239*e0c4386eSCy Schubert CT_TEST_MAX_FILE_SIZE - 1); 240*e0c4386eSCy Schubert 241*e0c4386eSCy Schubert if (!TEST_int_ge(sct_text_len, 0)) 242*e0c4386eSCy Schubert goto end; 243*e0c4386eSCy Schubert expected_sct_text[sct_text_len] = '\0'; 244*e0c4386eSCy Schubert } 245*e0c4386eSCy Schubert 246*e0c4386eSCy Schubert CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE( 247*e0c4386eSCy Schubert ct_policy_ctx, fixture->ctlog_store); 248*e0c4386eSCy Schubert 249*e0c4386eSCy Schubert CT_POLICY_EVAL_CTX_set_time(ct_policy_ctx, fixture->epoch_time_in_ms); 250*e0c4386eSCy Schubert 251*e0c4386eSCy Schubert if (fixture->certificate_file != NULL) { 252*e0c4386eSCy Schubert int sct_extension_index; 253*e0c4386eSCy Schubert int i; 254*e0c4386eSCy Schubert X509_EXTENSION *sct_extension = NULL; 255*e0c4386eSCy Schubert 256*e0c4386eSCy Schubert if (!TEST_ptr(cert = load_pem_cert(fixture->certs_dir, 257*e0c4386eSCy Schubert fixture->certificate_file))) 258*e0c4386eSCy Schubert goto end; 259*e0c4386eSCy Schubert 260*e0c4386eSCy Schubert CT_POLICY_EVAL_CTX_set1_cert(ct_policy_ctx, cert); 261*e0c4386eSCy Schubert 262*e0c4386eSCy Schubert if (fixture->issuer_file != NULL) { 263*e0c4386eSCy Schubert if (!TEST_ptr(issuer = load_pem_cert(fixture->certs_dir, 264*e0c4386eSCy Schubert fixture->issuer_file))) 265*e0c4386eSCy Schubert goto end; 266*e0c4386eSCy Schubert CT_POLICY_EVAL_CTX_set1_issuer(ct_policy_ctx, issuer); 267*e0c4386eSCy Schubert } 268*e0c4386eSCy Schubert 269*e0c4386eSCy Schubert sct_extension_index = 270*e0c4386eSCy Schubert X509_get_ext_by_NID(cert, NID_ct_precert_scts, -1); 271*e0c4386eSCy Schubert sct_extension = X509_get_ext(cert, sct_extension_index); 272*e0c4386eSCy Schubert if (fixture->expected_sct_count > 0) { 273*e0c4386eSCy Schubert if (!TEST_ptr(sct_extension)) 274*e0c4386eSCy Schubert goto end; 275*e0c4386eSCy Schubert 276*e0c4386eSCy Schubert if (fixture->sct_text_file 277*e0c4386eSCy Schubert && !compare_extension_printout(sct_extension, 278*e0c4386eSCy Schubert expected_sct_text)) 279*e0c4386eSCy Schubert goto end; 280*e0c4386eSCy Schubert 281*e0c4386eSCy Schubert scts = X509V3_EXT_d2i(sct_extension); 282*e0c4386eSCy Schubert for (i = 0; i < sk_SCT_num(scts); ++i) { 283*e0c4386eSCy Schubert SCT *sct_i = sk_SCT_value(scts, i); 284*e0c4386eSCy Schubert 285*e0c4386eSCy Schubert if (!TEST_int_eq(SCT_get_source(sct_i), 286*e0c4386eSCy Schubert SCT_SOURCE_X509V3_EXTENSION)) { 287*e0c4386eSCy Schubert goto end; 288*e0c4386eSCy Schubert } 289*e0c4386eSCy Schubert } 290*e0c4386eSCy Schubert 291*e0c4386eSCy Schubert if (fixture->test_validity) { 292*e0c4386eSCy Schubert if (!assert_validity(fixture, scts, ct_policy_ctx)) 293*e0c4386eSCy Schubert goto end; 294*e0c4386eSCy Schubert } 295*e0c4386eSCy Schubert } else if (!TEST_ptr_null(sct_extension)) { 296*e0c4386eSCy Schubert goto end; 297*e0c4386eSCy Schubert } 298*e0c4386eSCy Schubert } 299*e0c4386eSCy Schubert 300*e0c4386eSCy Schubert if (fixture->tls_sct_list != NULL) { 301*e0c4386eSCy Schubert const unsigned char *p = fixture->tls_sct_list; 302*e0c4386eSCy Schubert 303*e0c4386eSCy Schubert if (!TEST_ptr(o2i_SCT_LIST(&scts, &p, fixture->tls_sct_list_len))) 304*e0c4386eSCy Schubert goto end; 305*e0c4386eSCy Schubert 306*e0c4386eSCy Schubert if (fixture->test_validity && cert != NULL) { 307*e0c4386eSCy Schubert if (!assert_validity(fixture, scts, ct_policy_ctx)) 308*e0c4386eSCy Schubert goto end; 309*e0c4386eSCy Schubert } 310*e0c4386eSCy Schubert 311*e0c4386eSCy Schubert if (fixture->sct_text_file 312*e0c4386eSCy Schubert && !compare_sct_list_printout(scts, expected_sct_text)) { 313*e0c4386eSCy Schubert goto end; 314*e0c4386eSCy Schubert } 315*e0c4386eSCy Schubert 316*e0c4386eSCy Schubert tls_sct_list_len = i2o_SCT_LIST(scts, &tls_sct_list); 317*e0c4386eSCy Schubert if (!TEST_mem_eq(fixture->tls_sct_list, fixture->tls_sct_list_len, 318*e0c4386eSCy Schubert tls_sct_list, tls_sct_list_len)) 319*e0c4386eSCy Schubert goto end; 320*e0c4386eSCy Schubert } 321*e0c4386eSCy Schubert success = 1; 322*e0c4386eSCy Schubert 323*e0c4386eSCy Schubert end: 324*e0c4386eSCy Schubert X509_free(cert); 325*e0c4386eSCy Schubert X509_free(issuer); 326*e0c4386eSCy Schubert SCT_LIST_free(scts); 327*e0c4386eSCy Schubert SCT_free(sct); 328*e0c4386eSCy Schubert CT_POLICY_EVAL_CTX_free(ct_policy_ctx); 329*e0c4386eSCy Schubert OPENSSL_free(tls_sct_list); 330*e0c4386eSCy Schubert return success; 331*e0c4386eSCy Schubert } 332*e0c4386eSCy Schubert 333*e0c4386eSCy Schubert # define SETUP_CT_TEST_FIXTURE() SETUP_TEST_FIXTURE(CT_TEST_FIXTURE, set_up) 334*e0c4386eSCy Schubert # define EXECUTE_CT_TEST() EXECUTE_TEST(execute_cert_test, tear_down) 335*e0c4386eSCy Schubert 336*e0c4386eSCy Schubert static int test_no_scts_in_certificate(void) 337*e0c4386eSCy Schubert { 338*e0c4386eSCy Schubert SETUP_CT_TEST_FIXTURE(); 339*e0c4386eSCy Schubert fixture->certs_dir = certs_dir; 340*e0c4386eSCy Schubert fixture->certificate_file = "leaf.pem"; 341*e0c4386eSCy Schubert fixture->issuer_file = "subinterCA.pem"; 342*e0c4386eSCy Schubert fixture->expected_sct_count = 0; 343*e0c4386eSCy Schubert EXECUTE_CT_TEST(); 344*e0c4386eSCy Schubert return result; 345*e0c4386eSCy Schubert } 346*e0c4386eSCy Schubert 347*e0c4386eSCy Schubert static int test_one_sct_in_certificate(void) 348*e0c4386eSCy Schubert { 349*e0c4386eSCy Schubert SETUP_CT_TEST_FIXTURE(); 350*e0c4386eSCy Schubert fixture->certs_dir = certs_dir; 351*e0c4386eSCy Schubert fixture->certificate_file = "embeddedSCTs1.pem"; 352*e0c4386eSCy Schubert fixture->issuer_file = "embeddedSCTs1_issuer.pem"; 353*e0c4386eSCy Schubert fixture->expected_sct_count = 1; 354*e0c4386eSCy Schubert fixture->sct_dir = certs_dir; 355*e0c4386eSCy Schubert fixture->sct_text_file = "embeddedSCTs1.sct"; 356*e0c4386eSCy Schubert EXECUTE_CT_TEST(); 357*e0c4386eSCy Schubert return result; 358*e0c4386eSCy Schubert } 359*e0c4386eSCy Schubert 360*e0c4386eSCy Schubert static int test_multiple_scts_in_certificate(void) 361*e0c4386eSCy Schubert { 362*e0c4386eSCy Schubert SETUP_CT_TEST_FIXTURE(); 363*e0c4386eSCy Schubert fixture->certs_dir = certs_dir; 364*e0c4386eSCy Schubert fixture->certificate_file = "embeddedSCTs3.pem"; 365*e0c4386eSCy Schubert fixture->issuer_file = "embeddedSCTs3_issuer.pem"; 366*e0c4386eSCy Schubert fixture->expected_sct_count = 3; 367*e0c4386eSCy Schubert fixture->sct_dir = certs_dir; 368*e0c4386eSCy Schubert fixture->sct_text_file = "embeddedSCTs3.sct"; 369*e0c4386eSCy Schubert EXECUTE_CT_TEST(); 370*e0c4386eSCy Schubert return result; 371*e0c4386eSCy Schubert } 372*e0c4386eSCy Schubert 373*e0c4386eSCy Schubert static int test_verify_one_sct(void) 374*e0c4386eSCy Schubert { 375*e0c4386eSCy Schubert SETUP_CT_TEST_FIXTURE(); 376*e0c4386eSCy Schubert fixture->certs_dir = certs_dir; 377*e0c4386eSCy Schubert fixture->certificate_file = "embeddedSCTs1.pem"; 378*e0c4386eSCy Schubert fixture->issuer_file = "embeddedSCTs1_issuer.pem"; 379*e0c4386eSCy Schubert fixture->expected_sct_count = fixture->expected_valid_sct_count = 1; 380*e0c4386eSCy Schubert fixture->test_validity = 1; 381*e0c4386eSCy Schubert EXECUTE_CT_TEST(); 382*e0c4386eSCy Schubert return result; 383*e0c4386eSCy Schubert } 384*e0c4386eSCy Schubert 385*e0c4386eSCy Schubert static int test_verify_multiple_scts(void) 386*e0c4386eSCy Schubert { 387*e0c4386eSCy Schubert SETUP_CT_TEST_FIXTURE(); 388*e0c4386eSCy Schubert fixture->certs_dir = certs_dir; 389*e0c4386eSCy Schubert fixture->certificate_file = "embeddedSCTs3.pem"; 390*e0c4386eSCy Schubert fixture->issuer_file = "embeddedSCTs3_issuer.pem"; 391*e0c4386eSCy Schubert fixture->expected_sct_count = fixture->expected_valid_sct_count = 3; 392*e0c4386eSCy Schubert fixture->test_validity = 1; 393*e0c4386eSCy Schubert EXECUTE_CT_TEST(); 394*e0c4386eSCy Schubert return result; 395*e0c4386eSCy Schubert } 396*e0c4386eSCy Schubert 397*e0c4386eSCy Schubert static int test_verify_fails_for_future_sct(void) 398*e0c4386eSCy Schubert { 399*e0c4386eSCy Schubert SETUP_CT_TEST_FIXTURE(); 400*e0c4386eSCy Schubert fixture->epoch_time_in_ms = 1365094800000ULL; /* Apr 4 17:00:00 2013 GMT */ 401*e0c4386eSCy Schubert fixture->certs_dir = certs_dir; 402*e0c4386eSCy Schubert fixture->certificate_file = "embeddedSCTs1.pem"; 403*e0c4386eSCy Schubert fixture->issuer_file = "embeddedSCTs1_issuer.pem"; 404*e0c4386eSCy Schubert fixture->expected_sct_count = 1; 405*e0c4386eSCy Schubert fixture->expected_valid_sct_count = 0; 406*e0c4386eSCy Schubert fixture->test_validity = 1; 407*e0c4386eSCy Schubert EXECUTE_CT_TEST(); 408*e0c4386eSCy Schubert return result; 409*e0c4386eSCy Schubert } 410*e0c4386eSCy Schubert 411*e0c4386eSCy Schubert static int test_decode_tls_sct(void) 412*e0c4386eSCy Schubert { 413*e0c4386eSCy Schubert const unsigned char tls_sct_list[] = "\x00\x78" /* length of list */ 414*e0c4386eSCy Schubert "\x00\x76" 415*e0c4386eSCy Schubert "\x00" /* version */ 416*e0c4386eSCy Schubert /* log ID */ 417*e0c4386eSCy Schubert "\xDF\x1C\x2E\xC1\x15\x00\x94\x52\x47\xA9\x61\x68\x32\x5D\xDC\x5C\x79" 418*e0c4386eSCy Schubert "\x59\xE8\xF7\xC6\xD3\x88\xFC\x00\x2E\x0B\xBD\x3F\x74\xD7\x64" 419*e0c4386eSCy Schubert "\x00\x00\x01\x3D\xDB\x27\xDF\x93" /* timestamp */ 420*e0c4386eSCy Schubert "\x00\x00" /* extensions length */ 421*e0c4386eSCy Schubert "" /* extensions */ 422*e0c4386eSCy Schubert "\x04\x03" /* hash and signature algorithms */ 423*e0c4386eSCy Schubert "\x00\x47" /* signature length */ 424*e0c4386eSCy Schubert /* signature */ 425*e0c4386eSCy Schubert "\x30\x45\x02\x20\x48\x2F\x67\x51\xAF\x35\xDB\xA6\x54\x36\xBE\x1F\xD6" 426*e0c4386eSCy Schubert "\x64\x0F\x3D\xBF\x9A\x41\x42\x94\x95\x92\x45\x30\x28\x8F\xA3\xE5\xE2" 427*e0c4386eSCy Schubert "\x3E\x06\x02\x21\x00\xE4\xED\xC0\xDB\x3A\xC5\x72\xB1\xE2\xF5\xE8\xAB" 428*e0c4386eSCy Schubert "\x6A\x68\x06\x53\x98\x7D\xCF\x41\x02\x7D\xFE\xFF\xA1\x05\x51\x9D\x89" 429*e0c4386eSCy Schubert "\xED\xBF\x08"; 430*e0c4386eSCy Schubert 431*e0c4386eSCy Schubert SETUP_CT_TEST_FIXTURE(); 432*e0c4386eSCy Schubert fixture->tls_sct_list = tls_sct_list; 433*e0c4386eSCy Schubert fixture->tls_sct_list_len = 0x7a; 434*e0c4386eSCy Schubert fixture->sct_dir = ct_dir; 435*e0c4386eSCy Schubert fixture->sct_text_file = "tls1.sct"; 436*e0c4386eSCy Schubert EXECUTE_CT_TEST(); 437*e0c4386eSCy Schubert return result; 438*e0c4386eSCy Schubert } 439*e0c4386eSCy Schubert 440*e0c4386eSCy Schubert static int test_encode_tls_sct(void) 441*e0c4386eSCy Schubert { 442*e0c4386eSCy Schubert const char log_id[] = "3xwuwRUAlFJHqWFoMl3cXHlZ6PfG04j8AC4LvT9012Q="; 443*e0c4386eSCy Schubert const uint64_t timestamp = 1; 444*e0c4386eSCy Schubert const char extensions[] = ""; 445*e0c4386eSCy Schubert const char signature[] = "BAMARzBAMiBIL2dRrzXbplQ2vh/WZA89v5pBQpSVkkUwKI+j5" 446*e0c4386eSCy Schubert "eI+BgIhAOTtwNs6xXKx4vXoq2poBlOYfc9BAn3+/6EFUZ2J7b8I"; 447*e0c4386eSCy Schubert SCT *sct = NULL; 448*e0c4386eSCy Schubert 449*e0c4386eSCy Schubert SETUP_CT_TEST_FIXTURE(); 450*e0c4386eSCy Schubert 451*e0c4386eSCy Schubert fixture->sct_list = sk_SCT_new_null(); 452*e0c4386eSCy Schubert if (fixture->sct_list == NULL) 453*e0c4386eSCy Schubert return 0; 454*e0c4386eSCy Schubert 455*e0c4386eSCy Schubert if (!TEST_ptr(sct = SCT_new_from_base64(SCT_VERSION_V1, log_id, 456*e0c4386eSCy Schubert CT_LOG_ENTRY_TYPE_X509, timestamp, 457*e0c4386eSCy Schubert extensions, signature))) 458*e0c4386eSCy Schubert 459*e0c4386eSCy Schubert return 0; 460*e0c4386eSCy Schubert 461*e0c4386eSCy Schubert sk_SCT_push(fixture->sct_list, sct); 462*e0c4386eSCy Schubert fixture->sct_dir = ct_dir; 463*e0c4386eSCy Schubert fixture->sct_text_file = "tls1.sct"; 464*e0c4386eSCy Schubert EXECUTE_CT_TEST(); 465*e0c4386eSCy Schubert return result; 466*e0c4386eSCy Schubert } 467*e0c4386eSCy Schubert 468*e0c4386eSCy Schubert /* 469*e0c4386eSCy Schubert * Tests that the CT_POLICY_EVAL_CTX default time is approximately now. 470*e0c4386eSCy Schubert * Allow +-10 minutes, as it may compensate for clock skew. 471*e0c4386eSCy Schubert */ 472*e0c4386eSCy Schubert static int test_default_ct_policy_eval_ctx_time_is_now(void) 473*e0c4386eSCy Schubert { 474*e0c4386eSCy Schubert int success = 0; 475*e0c4386eSCy Schubert CT_POLICY_EVAL_CTX *ct_policy_ctx = CT_POLICY_EVAL_CTX_new(); 476*e0c4386eSCy Schubert const time_t default_time = 477*e0c4386eSCy Schubert (time_t)(CT_POLICY_EVAL_CTX_get_time(ct_policy_ctx) / 1000); 478*e0c4386eSCy Schubert const time_t time_tolerance = 600; /* 10 minutes */ 479*e0c4386eSCy Schubert 480*e0c4386eSCy Schubert if (!TEST_time_t_le(abs((int)difftime(time(NULL), default_time)), 481*e0c4386eSCy Schubert time_tolerance)) 482*e0c4386eSCy Schubert goto end; 483*e0c4386eSCy Schubert 484*e0c4386eSCy Schubert success = 1; 485*e0c4386eSCy Schubert end: 486*e0c4386eSCy Schubert CT_POLICY_EVAL_CTX_free(ct_policy_ctx); 487*e0c4386eSCy Schubert return success; 488*e0c4386eSCy Schubert } 489*e0c4386eSCy Schubert 490*e0c4386eSCy Schubert static int test_ctlog_from_base64(void) 491*e0c4386eSCy Schubert { 492*e0c4386eSCy Schubert CTLOG *ctlogp = NULL; 493*e0c4386eSCy Schubert const char notb64[] = "\01\02\03\04"; 494*e0c4386eSCy Schubert const char pad[] = "===="; 495*e0c4386eSCy Schubert const char name[] = "name"; 496*e0c4386eSCy Schubert 497*e0c4386eSCy Schubert /* We expect these to both fail! */ 498*e0c4386eSCy Schubert if (!TEST_true(!CTLOG_new_from_base64(&ctlogp, notb64, name)) 499*e0c4386eSCy Schubert || !TEST_true(!CTLOG_new_from_base64(&ctlogp, pad, name))) 500*e0c4386eSCy Schubert return 0; 501*e0c4386eSCy Schubert return 1; 502*e0c4386eSCy Schubert } 503*e0c4386eSCy Schubert #endif 504*e0c4386eSCy Schubert 505*e0c4386eSCy Schubert int setup_tests(void) 506*e0c4386eSCy Schubert { 507*e0c4386eSCy Schubert #ifndef OPENSSL_NO_CT 508*e0c4386eSCy Schubert if ((ct_dir = getenv("CT_DIR")) == NULL) 509*e0c4386eSCy Schubert ct_dir = "ct"; 510*e0c4386eSCy Schubert if ((certs_dir = getenv("CERTS_DIR")) == NULL) 511*e0c4386eSCy Schubert certs_dir = "certs"; 512*e0c4386eSCy Schubert 513*e0c4386eSCy Schubert ADD_TEST(test_no_scts_in_certificate); 514*e0c4386eSCy Schubert ADD_TEST(test_one_sct_in_certificate); 515*e0c4386eSCy Schubert ADD_TEST(test_multiple_scts_in_certificate); 516*e0c4386eSCy Schubert ADD_TEST(test_verify_one_sct); 517*e0c4386eSCy Schubert ADD_TEST(test_verify_multiple_scts); 518*e0c4386eSCy Schubert ADD_TEST(test_verify_fails_for_future_sct); 519*e0c4386eSCy Schubert ADD_TEST(test_decode_tls_sct); 520*e0c4386eSCy Schubert ADD_TEST(test_encode_tls_sct); 521*e0c4386eSCy Schubert ADD_TEST(test_default_ct_policy_eval_ctx_time_is_now); 522*e0c4386eSCy Schubert ADD_TEST(test_ctlog_from_base64); 523*e0c4386eSCy Schubert #else 524*e0c4386eSCy Schubert printf("No CT support\n"); 525*e0c4386eSCy Schubert #endif 526*e0c4386eSCy Schubert return 1; 527*e0c4386eSCy Schubert } 528