tls13secretstest.c 11.8 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
int ossl_statem_export_early_allowed(SSL *s)
{
    return 1;
}

225 226 227 228 229 230 231
/* 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)
{
232
    size_t hashsize;
233
    unsigned char gensecret[EVP_MAX_MD_SIZE];
234
    unsigned char hash[EVP_MAX_MD_SIZE];
235 236
    unsigned char key[KEYLEN];
    unsigned char iv[IVLEN];
237
    const EVP_MD *md = ssl_handshake_md(s);
238

239
    if (!ssl_handshake_hash(s, hash, sizeof(hash), &hashsize)) {
P
Pauli 已提交
240
        TEST_error("Failed to get hash");
241 242 243
        return 0;
    }

244 245
    if (!tls13_hkdf_expand(s, md, prk, label, labellen, hash, hashsize,
                           gensecret, hashsize)) {
P
Pauli 已提交
246
        TEST_error("Secret generation failed");
247 248 249
        return 0;
    }

P
Pauli 已提交
250
    if (!TEST_mem_eq(gensecret, hashsize, ref_secret, hashsize))
251 252
        return 0;

253
    if (!tls13_derive_key(s, md, gensecret, key, KEYLEN)) {
P
Pauli 已提交
254
        TEST_error("Key generation failed");
255 256 257
        return 0;
    }

P
Pauli 已提交
258
    if (!TEST_mem_eq(key, KEYLEN, ref_key, KEYLEN))
259 260
        return 0;

261
    if (!tls13_derive_iv(s, md, gensecret, iv, IVLEN)) {
P
Pauli 已提交
262
        TEST_error("IV generation failed");
263 264 265
        return 0;
    }

P
Pauli 已提交
266
    if (!TEST_mem_eq(iv, IVLEN, ref_iv, IVLEN))
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
        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 已提交
282
    if (!TEST_ptr(ctx))
283 284 285
        goto err;

    s = SSL_new(ctx);
P
Pauli 已提交
286
    if (!TEST_ptr(s ))
287 288
        goto err;

289
    s->session = SSL_SESSION_new();
P
Pauli 已提交
290
    if (!TEST_ptr(s->session))
291 292
        goto err;

P
Pauli 已提交
293 294 295
    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");
296 297 298
        goto err;
    }

P
Pauli 已提交
299 300 301
    if (!TEST_mem_eq(s->early_secret, sizeof(early_secret),
                     early_secret, sizeof(early_secret))) {
        TEST_info("Early secret does not match");
302 303 304
        goto err;
    }

P
Pauli 已提交
305 306
    if (!TEST_true(tls13_generate_handshake_secret(s, ecdhe_secret,
                                                   sizeof(ecdhe_secret)))) {
F
FdaSilvaYY 已提交
307
        TEST_info("Handshake secret generation failed");
308 309 310
        goto err;
    }

P
Pauli 已提交
311 312
    if (!TEST_mem_eq(s->handshake_secret, sizeof(handshake_secret),
                     handshake_secret, sizeof(handshake_secret)))
313 314 315
        goto err;

    hashsize = EVP_MD_size(ssl_handshake_md(s));
P
Pauli 已提交
316 317 318 319 320
    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))
321 322
        goto err;

P
Pauli 已提交
323 324 325 326 327
    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");
328 329 330
        goto err;
    }

P
Pauli 已提交
331 332 333 334 335
    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))
336 337
        goto err;

P
Pauli 已提交
338 339 340 341 342
    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");
343 344 345 346 347 348 349 350 351
        goto err;
    }

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

P
Pauli 已提交
352 353 354 355
    if (!TEST_true(tls13_generate_master_secret(s, out_master_secret,
                                                s->handshake_secret, hashsize,
                                                &master_secret_length))) {
        TEST_info("Master secret generation failed");
356 357 358
        goto err;
    }

P
Pauli 已提交
359 360 361
    if (!TEST_mem_eq(out_master_secret, master_secret_length,
                     master_secret, sizeof(master_secret))) {
        TEST_info("Master secret does not match");
362 363 364
        goto err;
    }

P
Pauli 已提交
365 366 367 368 369
    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))
370 371
        goto err;

P
Pauli 已提交
372 373 374 375 376
    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");
377 378 379
        goto err;
    }

P
Pauli 已提交
380 381 382 383 384
    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))
385 386
        goto err;

P
Pauli 已提交
387 388 389 390 391
    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");
392 393 394 395 396 397 398 399 400 401
        goto err;
    }

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

402
int setup_tests(void)
403 404
{
    ADD_TEST(test_handshake_secrets);
405
    return 1;
406
}