tls13secretstest.c 11.7 KB
Newer Older
1
/*
M
Matt Caswell 已提交
2
 * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
3 4 5 6 7 8 9 10 11
 *
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include <openssl/ssl.h>
#include <openssl/evp.h>
12 13 14 15 16 17

#ifdef __VMS
# pragma names save
# pragma names as_is,shortened
#endif

18 19
#include "../ssl/ssl_locl.h"

20 21 22 23
#ifdef __VMS
# pragma names restore
#endif

24 25 26 27 28
#include "testutil.h"

#define IVLEN   12
#define KEYLEN  16

29 30 31 32
/* The following are self-generated test vectors. This gives us very little
 * confidence that we've got the implementation right, but at least tells us
 * if we accidentally  break something in the future. Until we can get some
 * other source of test vectors this is all we've got.
33 34 35 36
 * TODO(TLS1.3): As and when official vectors become available we should use
 * those, e.g. see
 * https://www.ietf.org/id/draft-thomson-tls-tls13-vectors-00.txt, however at
 * the time of writing these are not suitable because they are based on
37
 * draft -16, which works differently to the draft -20 vectors below.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
 */

static unsigned char hs_start_hash[] = {
0xec, 0x14, 0x7a, 0x06, 0xde, 0xa3, 0xc8, 0x84, 0x6c, 0x02, 0xb2, 0x23, 0x8e,
0x41, 0xbd, 0xdc, 0x9d, 0x89, 0xf9, 0xae, 0xa1, 0x7b, 0x5e, 0xfd, 0x4d, 0x74,
0x82, 0xaf, 0x75, 0x88, 0x1c, 0x0a
};

static unsigned char hs_full_hash[] = {
0x75, 0x1a, 0x3d, 0x4a, 0x14, 0xdf, 0xab, 0xeb, 0x68, 0xe9, 0x2c, 0xa5, 0x91,
0x8e, 0x24, 0x08, 0xb9, 0xbc, 0xb0, 0x74, 0x89, 0x82, 0xec, 0x9c, 0x32, 0x30,
0xac, 0x30, 0xbb, 0xeb, 0x23, 0xe2,
};

static unsigned char early_secret[] = {
0x33, 0xad, 0x0a, 0x1c, 0x60, 0x7e, 0xc0, 0x3b, 0x09, 0xe6, 0xcd, 0x98, 0x93,
0x68, 0x0c, 0xe2, 0x10, 0xad, 0xf3, 0x00, 0xaa, 0x1f, 0x26, 0x60, 0xe1, 0xb2,
0x2e, 0x10, 0xf1, 0x70, 0xf9, 0x2a
};

static unsigned char ecdhe_secret[] = {
0xe7, 0xb8, 0xfe, 0xf8, 0x90, 0x3b, 0x52, 0x0c, 0xb9, 0xa1, 0x89, 0x71, 0xb6,
0x9d, 0xd4, 0x5d, 0xca, 0x53, 0xce, 0x2f, 0x12, 0xbf, 0x3b, 0xef, 0x93, 0x15,
0xe3, 0x12, 0x71, 0xdf, 0x4b, 0x40
};

static unsigned char handshake_secret[] = {
65 66 67
0xf5, 0x51, 0xd0, 0xbd, 0x9e, 0x6a, 0xc0, 0x95, 0x5f, 0x8e, 0xae, 0xb6, 0x28,
0x2e, 0x8d, 0x9e, 0xf3, 0xd4, 0x08, 0x57, 0x81, 0xbc, 0x9d, 0x80, 0x91, 0x8a,
0x81, 0x33, 0x86, 0x58, 0x7f, 0x46
68 69
};

70
static const char *client_hts_label = "c hs traffic";
71 72

static unsigned char client_hts[] = {
73 74 75
0x61, 0x7b, 0x35, 0x07, 0x6b, 0x9d, 0x0e, 0x08, 0xcf, 0x73, 0x1d, 0x94, 0xa8,
0x66, 0x14, 0x78, 0x41, 0x09, 0xef, 0x25, 0x55, 0x51, 0x92, 0x1d, 0xd4, 0x6e,
0x04, 0x01, 0x35, 0xcf, 0x46, 0xab
76 77 78
};

static unsigned char client_hts_key[] = {
79 80
0x62, 0xd0, 0xdd, 0x00, 0xf6, 0x96, 0x19, 0xd3, 0xb8, 0x19, 0x3a, 0xb4, 0xa0,
0x95, 0x85, 0xa7
81 82 83
};

static unsigned char client_hts_iv[] = {
84
0xff, 0xf7, 0x5d, 0xf5, 0xad, 0x35, 0xd5, 0xcb, 0x3c, 0x53, 0xf3, 0xa9
85 86
};

87
static const char *server_hts_label = "s hs traffic";
88 89

static unsigned char server_hts[] = {
90 91 92
0xfc, 0xf7, 0xdf, 0xe6, 0x4f, 0xa2, 0xc0, 0x4f, 0x62, 0x35, 0x38, 0x7f, 0x43,
0x4e, 0x01, 0x42, 0x23, 0x36, 0xd9, 0xc0, 0x39, 0xde, 0x68, 0x47, 0xa0, 0xb9,
0xdd, 0xcf, 0x29, 0xa8, 0x87, 0x59
93 94 95
};

static unsigned char server_hts_key[] = {
96 97
0x04, 0x67, 0xf3, 0x16, 0xa8, 0x05, 0xb8, 0xc4, 0x97, 0xee, 0x67, 0x04, 0x7b,
0xbc, 0xbc, 0x54
98 99 100
};

static unsigned char server_hts_iv[] = {
101
0xde, 0x83, 0xa7, 0x3e, 0x9d, 0x81, 0x4b, 0x04, 0xc4, 0x8b, 0x78, 0x09
102 103 104
};

static unsigned char master_secret[] = {
105 106 107
0x34, 0x83, 0x83, 0x84, 0x67, 0x12, 0xe7, 0xff, 0x24, 0xe8, 0x6e, 0x70, 0x56,
0x95, 0x16, 0x71, 0x43, 0x7f, 0x19, 0xd7, 0x85, 0x06, 0x9d, 0x75, 0x70, 0x49,
0x6e, 0x6c, 0xa4, 0x81, 0xf0, 0xb8
108 109
};

110
static const char *client_ats_label = "c ap traffic";
111 112

static unsigned char client_ats[] = {
113 114 115
0xc1, 0x4a, 0x6d, 0x79, 0x76, 0xd8, 0x10, 0x2b, 0x5a, 0x0c, 0x99, 0x51, 0x49,
0x3f, 0xee, 0x87, 0xdc, 0xaf, 0xf8, 0x2c, 0x24, 0xca, 0xb2, 0x14, 0xe8, 0xbe,
0x71, 0xa8, 0x20, 0x6d, 0xbd, 0xa5
116 117 118
};

static unsigned char client_ats_key[] = {
119 120
0xcc, 0x9f, 0x5f, 0x98, 0x0b, 0x5f, 0x10, 0x30, 0x6c, 0xba, 0xd7, 0xbe, 0x98,
0xd7, 0x57, 0x2e
121 122 123
};

static unsigned char client_ats_iv[] = {
124
0xb8, 0x09, 0x29, 0xe8, 0xd0, 0x2c, 0x70, 0xf6, 0x11, 0x62, 0xed, 0x6b
125 126
};

127
static const char *server_ats_label = "s ap traffic";
128 129

static unsigned char server_ats[] = {
130 131 132
0x2c, 0x90, 0x77, 0x38, 0xd3, 0xf8, 0x37, 0x02, 0xd1, 0xe4, 0x59, 0x8f, 0x48,
0x48, 0x53, 0x1d, 0x9f, 0x93, 0x65, 0x49, 0x1b, 0x9f, 0x7f, 0x52, 0xc8, 0x22,
0x29, 0x0d, 0x4c, 0x23, 0x21, 0x92
133 134 135
};

static unsigned char server_ats_key[] = {
136 137
0x0c, 0xb2, 0x95, 0x62, 0xd8, 0xd8, 0x8f, 0x48, 0xb0, 0x2c, 0xbf, 0xbe, 0xd7,
0xe6, 0x2b, 0xb3
138 139 140
};

static unsigned char server_ats_iv[] = {
141
0x0d, 0xb2, 0x8f, 0x98, 0x85, 0x86, 0xa1, 0xb7, 0xe4, 0xd5, 0xc6, 0x9c
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
};

/* Mocked out implementations of various functions */
int ssl3_digest_cached_records(SSL *s, int keep)
{
    return 1;
}

static int full_hash = 0;

/* Give a hash of the currently set handshake */
int ssl_handshake_hash(SSL *s, unsigned char *out, size_t outlen,
                       size_t *hashlen)
{
    if (sizeof(hs_start_hash) > outlen
            || sizeof(hs_full_hash) != sizeof(hs_start_hash))
        return 0;

    if (full_hash) {
        memcpy(out, hs_full_hash, sizeof(hs_full_hash));
        *hashlen = sizeof(hs_full_hash);
    } else {
        memcpy(out, hs_start_hash, sizeof(hs_start_hash));
        *hashlen = sizeof(hs_start_hash);
    }

    return 1;
}

const EVP_MD *ssl_handshake_md(SSL *s)
{
    return EVP_sha256();
}

176 177 178 179 180 181 182 183
void RECORD_LAYER_reset_read_sequence(RECORD_LAYER *rl)
{
}

void RECORD_LAYER_reset_write_sequence(RECORD_LAYER *rl)
{
}

184 185 186 187 188 189 190 191
int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc,
                       const EVP_MD **md, int *mac_pkey_type,
                       size_t *mac_secret_size, SSL_COMP **comp, int use_etm)

{
    return 0;
}

192 193 194 195 196
int tls1_alert_code(int code)
{
    return code;
}

C
Cory Benfield 已提交
197 198 199 200 201 202 203 204
int ssl_log_secret(SSL *ssl,
                   const char *label,
                   const uint8_t *secret,
                   size_t secret_len)
{
    return 1;
}

205 206 207 208 209
const EVP_MD *ssl_md(int idx)
{
    return EVP_sha256();
}

210 211 212 213 214
void ossl_statem_fatal(SSL *s, int al, int func, int reason, const char *file,
                           int line)
{
}

215 216 217 218 219
int ossl_statem_export_allowed(SSL *s)
{
    return 1;
}

220 221 222 223 224 225 226
/* End of mocked out code */

static int test_secret(SSL *s, unsigned char *prk,
                       const unsigned char *label, size_t labellen,
                       const unsigned char *ref_secret,
                       const unsigned char *ref_key, const unsigned char *ref_iv)
{
227
    size_t hashsize;
228
    unsigned char gensecret[EVP_MAX_MD_SIZE];
229
    unsigned char hash[EVP_MAX_MD_SIZE];
230 231
    unsigned char key[KEYLEN];
    unsigned char iv[IVLEN];
232
    const EVP_MD *md = ssl_handshake_md(s);
233

234
    if (!ssl_handshake_hash(s, hash, sizeof(hash), &hashsize)) {
P
Pauli 已提交
235
        TEST_error("Failed to get hash");
236 237 238
        return 0;
    }

239 240
    if (!tls13_hkdf_expand(s, md, prk, label, labellen, hash, hashsize,
                           gensecret, hashsize)) {
P
Pauli 已提交
241
        TEST_error("Secret generation failed");
242 243 244
        return 0;
    }

P
Pauli 已提交
245
    if (!TEST_mem_eq(gensecret, hashsize, ref_secret, hashsize))
246 247
        return 0;

248
    if (!tls13_derive_key(s, md, gensecret, key, KEYLEN)) {
P
Pauli 已提交
249
        TEST_error("Key generation failed");
250 251 252
        return 0;
    }

P
Pauli 已提交
253
    if (!TEST_mem_eq(key, KEYLEN, ref_key, KEYLEN))
254 255
        return 0;

256
    if (!tls13_derive_iv(s, md, gensecret, iv, IVLEN)) {
P
Pauli 已提交
257
        TEST_error("IV generation failed");
258 259 260
        return 0;
    }

P
Pauli 已提交
261
    if (!TEST_mem_eq(iv, IVLEN, ref_iv, IVLEN))
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
        return 0;

    return 1;
}

static int test_handshake_secrets(void)
{
    SSL_CTX *ctx = NULL;
    SSL *s = NULL;
    int ret = 0;
    size_t hashsize;
    unsigned char out_master_secret[EVP_MAX_MD_SIZE];
    size_t master_secret_length;

    ctx = SSL_CTX_new(TLS_method());
P
Pauli 已提交
277
    if (!TEST_ptr(ctx))
278 279 280
        goto err;

    s = SSL_new(ctx);
P
Pauli 已提交
281
    if (!TEST_ptr(s ))
282 283
        goto err;

284
    s->session = SSL_SESSION_new();
P
Pauli 已提交
285
    if (!TEST_ptr(s->session))
286 287
        goto err;

P
Pauli 已提交
288 289 290
    if (!TEST_true(tls13_generate_secret(s, ssl_handshake_md(s), NULL, NULL, 0,
                                         (unsigned char *)&s->early_secret))) {
        TEST_info("Early secret generation failed");
291 292 293
        goto err;
    }

P
Pauli 已提交
294 295 296
    if (!TEST_mem_eq(s->early_secret, sizeof(early_secret),
                     early_secret, sizeof(early_secret))) {
        TEST_info("Early secret does not match");
297 298 299
        goto err;
    }

P
Pauli 已提交
300 301
    if (!TEST_true(tls13_generate_handshake_secret(s, ecdhe_secret,
                                                   sizeof(ecdhe_secret)))) {
F
FdaSilvaYY 已提交
302
        TEST_info("Handshake secret generation failed");
303 304 305
        goto err;
    }

P
Pauli 已提交
306 307
    if (!TEST_mem_eq(s->handshake_secret, sizeof(handshake_secret),
                     handshake_secret, sizeof(handshake_secret)))
308 309 310
        goto err;

    hashsize = EVP_MD_size(ssl_handshake_md(s));
P
Pauli 已提交
311 312 313 314 315
    if (!TEST_size_t_eq(sizeof(client_hts), hashsize))
        goto err;
    if (!TEST_size_t_eq(sizeof(client_hts_key), KEYLEN))
        goto err;
    if (!TEST_size_t_eq(sizeof(client_hts_iv), IVLEN))
316 317
        goto err;

P
Pauli 已提交
318 319 320 321 322
    if (!TEST_true(test_secret(s, s->handshake_secret,
                               (unsigned char *)client_hts_label,
                               strlen(client_hts_label), client_hts,
                               client_hts_key, client_hts_iv))) {
        TEST_info("Client handshake secret test failed");
323 324 325
        goto err;
    }

P
Pauli 已提交
326 327 328 329 330
    if (!TEST_size_t_eq(sizeof(server_hts), hashsize))
        goto err;
    if (!TEST_size_t_eq(sizeof(server_hts_key), KEYLEN))
        goto err;
    if (!TEST_size_t_eq(sizeof(server_hts_iv), IVLEN))
331 332
        goto err;

P
Pauli 已提交
333 334 335 336 337
    if (!TEST_true(test_secret(s, s->handshake_secret,
                               (unsigned char *)server_hts_label,
                               strlen(server_hts_label), server_hts,
                               server_hts_key, server_hts_iv))) {
        TEST_info("Server handshake secret test failed");
338 339 340 341 342 343 344 345 346
        goto err;
    }

    /*
     * Ensure the mocked out ssl_handshake_hash() returns the full handshake
     * hash.
     */
    full_hash = 1;

P
Pauli 已提交
347 348 349 350
    if (!TEST_true(tls13_generate_master_secret(s, out_master_secret,
                                                s->handshake_secret, hashsize,
                                                &master_secret_length))) {
        TEST_info("Master secret generation failed");
351 352 353
        goto err;
    }

P
Pauli 已提交
354 355 356
    if (!TEST_mem_eq(out_master_secret, master_secret_length,
                     master_secret, sizeof(master_secret))) {
        TEST_info("Master secret does not match");
357 358 359
        goto err;
    }

P
Pauli 已提交
360 361 362 363 364
    if (!TEST_size_t_eq(sizeof(client_ats), hashsize))
        goto err;
    if (!TEST_size_t_eq(sizeof(client_ats_key), KEYLEN))
        goto err;
    if (!TEST_size_t_eq(sizeof(client_ats_iv), IVLEN))
365 366
        goto err;

P
Pauli 已提交
367 368 369 370 371
    if (!TEST_true(test_secret(s, out_master_secret,
                               (unsigned char *)client_ats_label,
                               strlen(client_ats_label), client_ats,
                               client_ats_key, client_ats_iv))) {
        TEST_info("Client application data secret test failed");
372 373 374
        goto err;
    }

P
Pauli 已提交
375 376 377 378 379
    if (!TEST_size_t_eq(sizeof(server_ats), hashsize))
        goto err;
    if (!TEST_size_t_eq(sizeof(server_ats_key), KEYLEN))
        goto err;
    if (!TEST_size_t_eq(sizeof(server_ats_iv), IVLEN))
380 381
        goto err;

P
Pauli 已提交
382 383 384 385 386
    if (!TEST_true(test_secret(s, out_master_secret,
                               (unsigned char *)server_ats_label,
                               strlen(server_ats_label), server_ats,
                               server_ats_key, server_ats_iv))) {
        TEST_info("Server application data secret test failed");
387 388 389 390 391 392 393 394 395 396
        goto err;
    }

    ret = 1;
 err:
    SSL_free(s);
    SSL_CTX_free(ctx);
    return ret;
}

397
int setup_tests()
398 399
{
    ADD_TEST(test_handshake_secrets);
400
    return 1;
401
}