Coverage Report

Created: 2025-07-12 06:52

/src/picotls/lib/openssl.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2016 DeNA Co., Ltd., Kazuho Oku
3
 *
4
 * Permission is hereby granted, free of charge, to any person obtaining a copy
5
 * of this software and associated documentation files (the "Software"), to
6
 * deal in the Software without restriction, including without limitation the
7
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8
 * sell copies of the Software, and to permit persons to whom the Software is
9
 * furnished to do so, subject to the following conditions:
10
 *
11
 * The above copyright notice and this permission notice shall be included in
12
 * all copies or substantial portions of the Software.
13
 *
14
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20
 * IN THE SOFTWARE.
21
 */
22
23
#ifdef _WINDOWS
24
#include "wincompat.h"
25
#else
26
#include <unistd.h>
27
#endif
28
#include <assert.h>
29
#include <stdio.h>
30
#include <stdlib.h>
31
#include <string.h>
32
#define OPENSSL_API_COMPAT 0x00908000L
33
#include <openssl/bn.h>
34
#include <openssl/crypto.h>
35
#ifdef OPENSSL_IS_BORINGSSL
36
#include <openssl/curve25519.h>
37
#include <openssl/chacha.h>
38
#include <openssl/poly1305.h>
39
#endif
40
#include <openssl/ec.h>
41
#include <openssl/ecdh.h>
42
#include <openssl/err.h>
43
#include <openssl/evp.h>
44
#include <openssl/objects.h>
45
#include <openssl/rand.h>
46
#include <openssl/rsa.h>
47
#include <openssl/x509.h>
48
#include <openssl/x509v3.h>
49
#include <openssl/x509_vfy.h>
50
#include "picotls.h"
51
#include "picotls/openssl.h"
52
#ifdef OPENSSL_IS_BORINGSSL
53
#include "./chacha20poly1305.h"
54
#endif
55
#if PTLS_OPENSSL_HAVE_X25519MLKEM768
56
#include <openssl/mlkem.h>
57
#endif
58
#ifdef PTLS_HAVE_AEGIS
59
#include "./libaegis.h"
60
#endif
61
62
#ifdef _WINDOWS
63
#ifndef _CRT_SECURE_NO_WARNINGS
64
#define _CRT_SECURE_NO_WARNINGS
65
#endif
66
#pragma warning(disable : 4996)
67
#endif
68
69
#if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
70
#define OPENSSL_1_1_API 1
71
#elif defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x2070000fL
72
#define OPENSSL_1_1_API 1
73
#else
74
#define OPENSSL_1_1_API 0
75
#endif
76
77
#if !OPENSSL_1_1_API
78
79
#define EVP_PKEY_up_ref(p) CRYPTO_add(&(p)->references, 1, CRYPTO_LOCK_EVP_PKEY)
80
#define X509_STORE_up_ref(p) CRYPTO_add(&(p)->references, 1, CRYPTO_LOCK_X509_STORE)
81
#define X509_STORE_get0_param(p) ((p)->param)
82
83
static HMAC_CTX *HMAC_CTX_new(void)
84
{
85
    HMAC_CTX *ctx;
86
87
    if ((ctx = OPENSSL_malloc(sizeof(*ctx))) == NULL)
88
        return NULL;
89
    HMAC_CTX_init(ctx);
90
    return ctx;
91
}
92
93
static void HMAC_CTX_free(HMAC_CTX *ctx)
94
{
95
    HMAC_CTX_cleanup(ctx);
96
    OPENSSL_free(ctx);
97
}
98
99
static int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *ctx)
100
{
101
    return EVP_CIPHER_CTX_cleanup(ctx);
102
}
103
104
#endif
105
106
static const ptls_openssl_signature_scheme_t rsa_signature_schemes[] = {{PTLS_SIGNATURE_RSA_PSS_RSAE_SHA256, EVP_sha256},
107
                                                                        {PTLS_SIGNATURE_RSA_PSS_RSAE_SHA384, EVP_sha384},
108
                                                                        {PTLS_SIGNATURE_RSA_PSS_RSAE_SHA512, EVP_sha512},
109
                                                                        {UINT16_MAX, NULL}};
110
static const ptls_openssl_signature_scheme_t secp256r1_signature_schemes[] = {{PTLS_SIGNATURE_ECDSA_SECP256R1_SHA256, EVP_sha256},
111
                                                                              {UINT16_MAX, NULL}};
112
#if PTLS_OPENSSL_HAVE_SECP384R1
113
static const ptls_openssl_signature_scheme_t secp384r1_signature_schemes[] = {{PTLS_SIGNATURE_ECDSA_SECP384R1_SHA384, EVP_sha384},
114
                                                                              {UINT16_MAX, NULL}};
115
#endif
116
#if PTLS_OPENSSL_HAVE_SECP521R1
117
static const ptls_openssl_signature_scheme_t secp521r1_signature_schemes[] = {{PTLS_SIGNATURE_ECDSA_SECP521R1_SHA512, EVP_sha512},
118
                                                                              {UINT16_MAX, NULL}};
119
#endif
120
#if PTLS_OPENSSL_HAVE_ED25519
121
static const ptls_openssl_signature_scheme_t ed25519_signature_schemes[] = {{PTLS_SIGNATURE_ED25519, NULL}, {UINT16_MAX, NULL}};
122
#endif
123
124
/**
125
 * The default list sent in ClientHello.signature_algorithms. ECDSA certificates are preferred.
126
 */
127
static const uint16_t default_signature_schemes[] = {
128
#if PTLS_OPENSSL_HAVE_ED25519
129
    PTLS_SIGNATURE_ED25519,
130
#endif
131
    PTLS_SIGNATURE_ECDSA_SECP256R1_SHA256,
132
#if PTLS_OPENSSL_HAVE_SECP384R1
133
    PTLS_SIGNATURE_ECDSA_SECP384R1_SHA384,
134
#endif
135
#if PTLS_OPENSSL_HAVE_SECP521R1
136
    PTLS_SIGNATURE_ECDSA_SECP521R1_SHA512,
137
#endif
138
    PTLS_SIGNATURE_RSA_PSS_RSAE_SHA512,
139
    PTLS_SIGNATURE_RSA_PSS_RSAE_SHA384,
140
    PTLS_SIGNATURE_RSA_PSS_RSAE_SHA256,
141
    UINT16_MAX};
142
143
const ptls_openssl_signature_scheme_t *ptls_openssl_lookup_signature_schemes(EVP_PKEY *key)
144
0
{
145
0
    const ptls_openssl_signature_scheme_t *schemes = NULL;
146
147
0
    switch (EVP_PKEY_id(key)) {
148
0
    case EVP_PKEY_RSA:
149
0
        schemes = rsa_signature_schemes;
150
0
        break;
151
0
    case EVP_PKEY_EC: {
152
0
        EC_KEY *eckey = EVP_PKEY_get1_EC_KEY(key);
153
0
        switch (EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey))) {
154
0
        case NID_X9_62_prime256v1:
155
0
            schemes = secp256r1_signature_schemes;
156
0
            break;
157
0
#if PTLS_OPENSSL_HAVE_SECP384R1
158
0
        case NID_secp384r1:
159
0
            schemes = secp384r1_signature_schemes;
160
0
            break;
161
0
#endif
162
0
#if PTLS_OPENSSL_HAVE_SECP521R1
163
0
        case NID_secp521r1:
164
0
            schemes = secp521r1_signature_schemes;
165
0
            break;
166
0
#endif
167
0
        default:
168
0
            break;
169
0
        }
170
0
        EC_KEY_free(eckey);
171
0
    } break;
172
0
#if PTLS_OPENSSL_HAVE_ED25519
173
0
    case EVP_PKEY_ED25519:
174
0
        schemes = ed25519_signature_schemes;
175
0
        break;
176
0
#endif
177
0
    default:
178
0
        break;
179
0
    }
180
181
0
    return schemes;
182
0
}
183
184
const ptls_openssl_signature_scheme_t *ptls_openssl_select_signature_scheme(const ptls_openssl_signature_scheme_t *available,
185
                                                                            const uint16_t *algorithms, size_t num_algorithms)
186
0
{
187
0
    const ptls_openssl_signature_scheme_t *scheme;
188
189
    /* select the algorithm, driven by server-isde preference of `available` */
190
0
    for (scheme = available; scheme->scheme_id != UINT16_MAX; ++scheme)
191
0
        for (size_t i = 0; i != num_algorithms; ++i)
192
0
            if (algorithms[i] == scheme->scheme_id)
193
0
                return scheme;
194
195
0
    return NULL;
196
0
}
197
198
void ptls_openssl_random_bytes(void *buf, size_t len)
199
0
{
200
0
    int ret = RAND_bytes(buf, (int)len);
201
0
    if (ret != 1) {
202
0
        fprintf(stderr, "RAND_bytes() failed with code: %d\n", ret);
203
0
        abort();
204
0
    }
205
0
}
206
207
static EC_KEY *ecdh_generate_key(EC_GROUP *group)
208
37.4k
{
209
37.4k
    EC_KEY *key;
210
211
37.4k
    if ((key = EC_KEY_new()) == NULL)
212
0
        return NULL;
213
37.4k
    if (!EC_KEY_set_group(key, group) || !EC_KEY_generate_key(key)) {
214
0
        EC_KEY_free(key);
215
0
        return NULL;
216
0
    }
217
218
37.4k
    return key;
219
37.4k
}
220
221
static int ecdh_calc_secret(ptls_iovec_t *out, const EC_GROUP *group, EC_KEY *privkey, EC_POINT *peer_point)
222
925
{
223
925
    ptls_iovec_t secret;
224
925
    int ret;
225
226
925
    secret.len = (EC_GROUP_get_degree(group) + 7) / 8;
227
925
    if ((secret.base = malloc(secret.len)) == NULL) {
228
0
        ret = PTLS_ERROR_NO_MEMORY;
229
0
        goto Exit;
230
0
    }
231
925
    if (ECDH_compute_key(secret.base, secret.len, peer_point, privkey, NULL) <= 0) {
232
1
        ret = PTLS_ALERT_HANDSHAKE_FAILURE; /* ??? */
233
1
        goto Exit;
234
1
    }
235
924
    ret = 0;
236
237
925
Exit:
238
925
    if (ret == 0) {
239
924
        *out = secret;
240
924
    } else {
241
1
        free(secret.base);
242
1
        *out = (ptls_iovec_t){NULL};
243
1
    }
244
925
    return ret;
245
924
}
246
247
static EC_POINT *x9_62_decode_point(const EC_GROUP *group, ptls_iovec_t vec, BN_CTX *bn_ctx)
248
926
{
249
926
    EC_POINT *point = NULL;
250
251
926
    if ((point = EC_POINT_new(group)) == NULL)
252
0
        return NULL;
253
926
    if (!EC_POINT_oct2point(group, point, vec.base, vec.len, bn_ctx)) {
254
1
        EC_POINT_free(point);
255
1
        return NULL;
256
1
    }
257
258
925
    return point;
259
926
}
260
261
static ptls_iovec_t x9_62_encode_point(const EC_GROUP *group, const EC_POINT *point, BN_CTX *bn_ctx)
262
37.4k
{
263
37.4k
    ptls_iovec_t vec;
264
265
37.4k
    if ((vec.len = EC_POINT_point2oct(group, point, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, bn_ctx)) == 0)
266
0
        return (ptls_iovec_t){NULL};
267
37.4k
    if ((vec.base = malloc(vec.len)) == NULL)
268
0
        return (ptls_iovec_t){NULL};
269
37.4k
    if (EC_POINT_point2oct(group, point, POINT_CONVERSION_UNCOMPRESSED, vec.base, vec.len, bn_ctx) != vec.len) {
270
0
        free(vec.base);
271
0
        return (ptls_iovec_t){NULL};
272
0
    }
273
274
37.4k
    return vec;
275
37.4k
}
276
277
struct st_x9_62_keyex_context_t {
278
    ptls_key_exchange_context_t super;
279
    BN_CTX *bn_ctx;
280
    EC_KEY *privkey;
281
};
282
283
static void x9_62_free_context(struct st_x9_62_keyex_context_t *ctx)
284
37.4k
{
285
37.4k
    free(ctx->super.pubkey.base);
286
37.4k
    if (ctx->privkey != NULL)
287
37.4k
        EC_KEY_free(ctx->privkey);
288
37.4k
    if (ctx->bn_ctx != NULL)
289
37.4k
        BN_CTX_free(ctx->bn_ctx);
290
37.4k
    free(ctx);
291
37.4k
}
292
293
static int x9_62_on_exchange(ptls_key_exchange_context_t **_ctx, int release, ptls_iovec_t *secret, ptls_iovec_t peerkey)
294
37.4k
{
295
37.4k
    struct st_x9_62_keyex_context_t *ctx = (struct st_x9_62_keyex_context_t *)*_ctx;
296
37.4k
    const EC_GROUP *group = EC_KEY_get0_group(ctx->privkey);
297
37.4k
    EC_POINT *peer_point = NULL;
298
37.4k
    int ret;
299
300
37.4k
    if (secret == NULL) {
301
36.5k
        ret = 0;
302
36.5k
        goto Exit;
303
36.5k
    }
304
305
926
    if ((peer_point = x9_62_decode_point(group, peerkey, ctx->bn_ctx)) == NULL) {
306
1
        ret = PTLS_ALERT_DECODE_ERROR;
307
1
        goto Exit;
308
1
    }
309
925
    if ((ret = ecdh_calc_secret(secret, group, ctx->privkey, peer_point)) != 0)
310
1
        goto Exit;
311
312
37.4k
Exit:
313
37.4k
    if (peer_point != NULL)
314
925
        EC_POINT_free(peer_point);
315
37.4k
    if (release) {
316
37.4k
        x9_62_free_context(ctx);
317
37.4k
        *_ctx = NULL;
318
37.4k
    }
319
37.4k
    return ret;
320
925
}
321
322
static int x9_62_create_context(ptls_key_exchange_algorithm_t *algo, struct st_x9_62_keyex_context_t **ctx)
323
37.4k
{
324
37.4k
    int ret;
325
326
37.4k
    if ((*ctx = (struct st_x9_62_keyex_context_t *)malloc(sizeof(**ctx))) == NULL) {
327
0
        ret = PTLS_ERROR_NO_MEMORY;
328
0
        goto Exit;
329
0
    }
330
37.4k
    **ctx = (struct st_x9_62_keyex_context_t){{algo, {NULL}, x9_62_on_exchange}};
331
332
37.4k
    if (((*ctx)->bn_ctx = BN_CTX_new()) == NULL) {
333
0
        ret = PTLS_ERROR_NO_MEMORY;
334
0
        goto Exit;
335
0
    }
336
337
37.4k
    ret = 0;
338
37.4k
Exit:
339
37.4k
    if (ret != 0 && *ctx != NULL) {
340
0
        x9_62_free_context(*ctx);
341
0
        *ctx = NULL;
342
0
    }
343
37.4k
    return ret;
344
37.4k
}
345
346
static int x9_62_setup_pubkey(struct st_x9_62_keyex_context_t *ctx)
347
37.4k
{
348
37.4k
    const EC_GROUP *group = EC_KEY_get0_group(ctx->privkey);
349
37.4k
    const EC_POINT *pubkey = EC_KEY_get0_public_key(ctx->privkey);
350
37.4k
    if ((ctx->super.pubkey = x9_62_encode_point(group, pubkey, ctx->bn_ctx)).base == NULL)
351
0
        return PTLS_ERROR_NO_MEMORY;
352
37.4k
    return 0;
353
37.4k
}
354
355
static int x9_62_create_key_exchange(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **_ctx)
356
37.4k
{
357
37.4k
    EC_GROUP *group = NULL;
358
37.4k
    struct st_x9_62_keyex_context_t *ctx = NULL;
359
37.4k
    int ret;
360
361
    /* FIXME use a global? */
362
37.4k
    if ((group = EC_GROUP_new_by_curve_name((int)algo->data)) == NULL) {
363
0
        ret = PTLS_ERROR_LIBRARY;
364
0
        goto Exit;
365
0
    }
366
37.4k
    if ((ret = x9_62_create_context(algo, &ctx)) != 0)
367
0
        goto Exit;
368
37.4k
    if ((ctx->privkey = ecdh_generate_key(group)) == NULL) {
369
0
        ret = PTLS_ERROR_LIBRARY;
370
0
        goto Exit;
371
0
    }
372
37.4k
    if ((ret = x9_62_setup_pubkey(ctx)) != 0)
373
0
        goto Exit;
374
37.4k
    ret = 0;
375
376
37.4k
Exit:
377
37.4k
    if (group != NULL)
378
37.4k
        EC_GROUP_free(group);
379
37.4k
    if (ret == 0) {
380
37.4k
        *_ctx = &ctx->super;
381
37.4k
    } else {
382
0
        if (ctx != NULL)
383
0
            x9_62_free_context(ctx);
384
0
        *_ctx = NULL;
385
0
    }
386
387
37.4k
    return ret;
388
37.4k
}
389
390
static int x9_62_init_key(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **_ctx, EC_KEY *eckey)
391
0
{
392
0
    struct st_x9_62_keyex_context_t *ctx = NULL;
393
0
    int ret;
394
395
0
    if ((ret = x9_62_create_context(algo, &ctx)) != 0)
396
0
        goto Exit;
397
0
    ctx->privkey = eckey;
398
0
    if ((ret = x9_62_setup_pubkey(ctx)) != 0)
399
0
        goto Exit;
400
0
    ret = 0;
401
402
0
Exit:
403
0
    if (ret == 0) {
404
0
        *_ctx = &ctx->super;
405
0
    } else {
406
0
        if (ctx != NULL)
407
0
            x9_62_free_context(ctx);
408
0
        *_ctx = NULL;
409
0
    }
410
0
    return ret;
411
0
}
412
413
static int x9_62_key_exchange(EC_GROUP *group, ptls_iovec_t *pubkey, ptls_iovec_t *secret, ptls_iovec_t peerkey, BN_CTX *bn_ctx)
414
0
{
415
0
    EC_POINT *peer_point = NULL;
416
0
    EC_KEY *privkey = NULL;
417
0
    int ret;
418
419
0
    *pubkey = (ptls_iovec_t){NULL};
420
0
    *secret = (ptls_iovec_t){NULL};
421
422
    /* decode peer key */
423
0
    if ((peer_point = x9_62_decode_point(group, peerkey, bn_ctx)) == NULL) {
424
0
        ret = PTLS_ALERT_DECODE_ERROR;
425
0
        goto Exit;
426
0
    }
427
428
    /* create private key */
429
0
    if ((privkey = ecdh_generate_key(group)) == NULL) {
430
0
        ret = PTLS_ERROR_NO_MEMORY;
431
0
        goto Exit;
432
0
    }
433
434
    /* encode public key */
435
0
    if ((*pubkey = x9_62_encode_point(group, EC_KEY_get0_public_key(privkey), bn_ctx)).base == NULL) {
436
0
        ret = PTLS_ERROR_NO_MEMORY;
437
0
        goto Exit;
438
0
    }
439
440
    /* allocate space for secret */
441
0
    secret->len = (EC_GROUP_get_degree(group) + 7) / 8;
442
0
    if ((secret->base = malloc(secret->len)) == NULL) {
443
0
        ret = PTLS_ERROR_NO_MEMORY;
444
0
        goto Exit;
445
0
    }
446
447
    /* calc secret */
448
0
    if (ECDH_compute_key(secret->base, secret->len, peer_point, privkey, NULL) <= 0) {
449
0
        ret = PTLS_ALERT_HANDSHAKE_FAILURE; /* ??? */
450
0
        goto Exit;
451
0
    }
452
453
0
    ret = 0;
454
455
0
Exit:
456
0
    if (peer_point != NULL)
457
0
        EC_POINT_free(peer_point);
458
0
    if (privkey != NULL)
459
0
        EC_KEY_free(privkey);
460
0
    if (ret != 0) {
461
0
        free(pubkey->base);
462
0
        *pubkey = (ptls_iovec_t){NULL};
463
0
        free(secret->base);
464
0
        *secret = (ptls_iovec_t){NULL};
465
0
    }
466
0
    return ret;
467
0
}
468
469
static int secp_key_exchange(ptls_key_exchange_algorithm_t *algo, ptls_iovec_t *pubkey, ptls_iovec_t *secret, ptls_iovec_t peerkey)
470
0
{
471
0
    EC_GROUP *group = NULL;
472
0
    BN_CTX *bn_ctx = NULL;
473
0
    int ret;
474
475
0
    if ((group = EC_GROUP_new_by_curve_name((int)algo->data)) == NULL) {
476
0
        ret = PTLS_ERROR_LIBRARY;
477
0
        goto Exit;
478
0
    }
479
0
    if ((bn_ctx = BN_CTX_new()) == NULL) {
480
0
        ret = PTLS_ERROR_NO_MEMORY;
481
0
        goto Exit;
482
0
    }
483
484
0
    ret = x9_62_key_exchange(group, pubkey, secret, peerkey, bn_ctx);
485
486
0
Exit:
487
0
    if (bn_ctx != NULL)
488
0
        BN_CTX_free(bn_ctx);
489
0
    if (group != NULL)
490
0
        EC_GROUP_free(group);
491
0
    return ret;
492
0
}
493
494
#if PTLS_OPENSSL_HAVE_X25519
495
496
struct st_evp_keyex_context_t {
497
    ptls_key_exchange_context_t super;
498
    EVP_PKEY *privkey;
499
};
500
501
static void evp_keyex_free(struct st_evp_keyex_context_t *ctx)
502
0
{
503
0
    if (ctx->privkey != NULL)
504
0
        EVP_PKEY_free(ctx->privkey);
505
0
    if (ctx->super.pubkey.base != NULL)
506
0
        OPENSSL_free(ctx->super.pubkey.base);
507
0
    free(ctx);
508
0
}
509
510
static int evp_keyex_on_exchange(ptls_key_exchange_context_t **_ctx, int release, ptls_iovec_t *secret, ptls_iovec_t peerkey)
511
0
{
512
0
    struct st_evp_keyex_context_t *ctx = (void *)*_ctx;
513
0
    EVP_PKEY *evppeer = NULL;
514
0
    EVP_PKEY_CTX *evpctx = NULL;
515
0
    int ret;
516
517
0
    if (secret == NULL) {
518
0
        ret = 0;
519
0
        goto Exit;
520
0
    }
521
522
0
    *secret = ptls_iovec_init(NULL, 0);
523
524
0
    if (peerkey.len != ctx->super.pubkey.len) {
525
0
        ret = PTLS_ALERT_DECRYPT_ERROR;
526
0
        goto Exit;
527
0
    }
528
529
#ifdef OPENSSL_IS_BORINGSSL
530
#define X25519_KEY_SIZE 32
531
    if (ctx->super.algo->id == PTLS_GROUP_X25519) {
532
        /* allocate memory to return secret */
533
        if ((secret->base = malloc(X25519_KEY_SIZE)) == NULL) {
534
            ret = PTLS_ERROR_NO_MEMORY;
535
            goto Exit;
536
        }
537
        secret->len = X25519_KEY_SIZE;
538
        /* fetch raw key and derive the secret */
539
        uint8_t sk_raw[X25519_KEY_SIZE];
540
        size_t sk_raw_len = sizeof(sk_raw);
541
        if (EVP_PKEY_get_raw_private_key(ctx->privkey, sk_raw, &sk_raw_len) != 1) {
542
            ret = PTLS_ERROR_LIBRARY;
543
            goto Exit;
544
        }
545
        assert(sk_raw_len == sizeof(sk_raw));
546
        X25519(secret->base, sk_raw, peerkey.base);
547
        ptls_clear_memory(sk_raw, sizeof(sk_raw));
548
        /* check bad key */
549
        static const uint8_t zeros[X25519_KEY_SIZE] = {0};
550
        if (ptls_mem_equal(secret->base, zeros, X25519_KEY_SIZE)) {
551
            ret = PTLS_ERROR_INCOMPATIBLE_KEY;
552
            goto Exit;
553
        }
554
        /* success */
555
        ret = 0;
556
        goto Exit;
557
    }
558
#undef X25519_KEY_SIZE
559
#endif
560
561
0
    if ((evppeer = EVP_PKEY_new()) == NULL) {
562
0
        ret = PTLS_ERROR_NO_MEMORY;
563
0
        goto Exit;
564
0
    }
565
0
    if (EVP_PKEY_copy_parameters(evppeer, ctx->privkey) <= 0) {
566
0
        ret = PTLS_ERROR_LIBRARY;
567
0
        goto Exit;
568
0
    }
569
0
    if (EVP_PKEY_set1_tls_encodedpoint(evppeer, peerkey.base, peerkey.len) <= 0) {
570
0
        ret = PTLS_ERROR_LIBRARY;
571
0
        goto Exit;
572
0
    }
573
0
    if ((evpctx = EVP_PKEY_CTX_new(ctx->privkey, NULL)) == NULL) {
574
0
        ret = PTLS_ERROR_LIBRARY;
575
0
        goto Exit;
576
0
    }
577
0
    if (EVP_PKEY_derive_init(evpctx) <= 0) {
578
0
        ret = PTLS_ERROR_LIBRARY;
579
0
        goto Exit;
580
0
    }
581
0
    if (EVP_PKEY_derive_set_peer(evpctx, evppeer) <= 0) {
582
0
        ret = PTLS_ERROR_LIBRARY;
583
0
        goto Exit;
584
0
    }
585
0
    if (EVP_PKEY_derive(evpctx, NULL, &secret->len) <= 0) {
586
0
        ret = PTLS_ERROR_LIBRARY;
587
0
        goto Exit;
588
0
    }
589
0
    if ((secret->base = malloc(secret->len)) == NULL) {
590
0
        ret = PTLS_ERROR_NO_MEMORY;
591
0
        goto Exit;
592
0
    }
593
0
    if (EVP_PKEY_derive(evpctx, secret->base, &secret->len) <= 0) {
594
0
        ret = PTLS_ERROR_LIBRARY;
595
0
        goto Exit;
596
0
    }
597
598
0
    ret = 0;
599
0
Exit:
600
0
    if (evpctx != NULL)
601
0
        EVP_PKEY_CTX_free(evpctx);
602
0
    if (evppeer != NULL)
603
0
        EVP_PKEY_free(evppeer);
604
0
    if (ret != 0) {
605
0
        free(secret->base);
606
0
        *secret = ptls_iovec_init(NULL, 0);
607
0
    }
608
0
    if (release) {
609
0
        evp_keyex_free(ctx);
610
0
        *_ctx = NULL;
611
0
    }
612
0
    return ret;
613
0
}
614
615
/**
616
 * Upon success, ownership of `pkey` is transferred to the object being created. Otherwise, the refcount remains unchanged.
617
 */
618
static int evp_keyex_init(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **_ctx, EVP_PKEY *pkey)
619
0
{
620
0
    struct st_evp_keyex_context_t *ctx = NULL;
621
0
    int ret;
622
623
    /* instantiate */
624
0
    if ((ctx = malloc(sizeof(*ctx))) == NULL) {
625
0
        ret = PTLS_ERROR_NO_MEMORY;
626
0
        goto Exit;
627
0
    }
628
0
    *ctx = (struct st_evp_keyex_context_t){{algo, {NULL}, evp_keyex_on_exchange}, pkey};
629
630
    /* set public key */
631
0
    if ((ctx->super.pubkey.len = EVP_PKEY_get1_tls_encodedpoint(ctx->privkey, &ctx->super.pubkey.base)) == 0) {
632
0
        ctx->super.pubkey.base = NULL;
633
0
        ret = PTLS_ERROR_NO_MEMORY;
634
0
        goto Exit;
635
0
    }
636
637
0
    *_ctx = &ctx->super;
638
0
    ret = 0;
639
0
Exit:
640
0
    if (ret != 0 && ctx != NULL) {
641
0
        ctx->privkey = NULL; /* do not decrement refcount of pkey in case of error */
642
0
        evp_keyex_free(ctx);
643
0
    }
644
0
    return ret;
645
0
}
646
647
static int evp_keyex_create(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **ctx)
648
0
{
649
0
    EVP_PKEY_CTX *evpctx = NULL;
650
0
    EVP_PKEY *pkey = NULL;
651
0
    int ret;
652
653
    /* generate private key */
654
0
    if ((evpctx = EVP_PKEY_CTX_new_id((int)algo->data, NULL)) == NULL) {
655
0
        ret = PTLS_ERROR_LIBRARY;
656
0
        goto Exit;
657
0
    }
658
0
    if (EVP_PKEY_keygen_init(evpctx) <= 0) {
659
0
        ret = PTLS_ERROR_LIBRARY;
660
0
        goto Exit;
661
0
    }
662
0
    if (EVP_PKEY_keygen(evpctx, &pkey) <= 0) {
663
0
        ret = PTLS_ERROR_LIBRARY;
664
0
        goto Exit;
665
0
    }
666
667
    /* setup */
668
0
    if ((ret = evp_keyex_init(algo, ctx, pkey)) != 0)
669
0
        goto Exit;
670
0
    pkey = NULL;
671
0
    ret = 0;
672
673
0
Exit:
674
0
    if (pkey != NULL)
675
0
        EVP_PKEY_free(pkey);
676
0
    if (evpctx != NULL)
677
0
        EVP_PKEY_CTX_free(evpctx);
678
0
    return ret;
679
0
}
680
681
static int evp_keyex_exchange(ptls_key_exchange_algorithm_t *algo, ptls_iovec_t *outpubkey, ptls_iovec_t *secret,
682
                              ptls_iovec_t peerkey)
683
0
{
684
0
    ptls_key_exchange_context_t *ctx = NULL;
685
0
    int ret;
686
687
0
    *outpubkey = ptls_iovec_init(NULL, 0);
688
689
0
    if ((ret = evp_keyex_create(algo, &ctx)) != 0)
690
0
        goto Exit;
691
0
    if ((outpubkey->base = malloc(ctx->pubkey.len)) == NULL) {
692
0
        ret = PTLS_ERROR_NO_MEMORY;
693
0
        goto Exit;
694
0
    }
695
0
    memcpy(outpubkey->base, ctx->pubkey.base, ctx->pubkey.len);
696
0
    outpubkey->len = ctx->pubkey.len;
697
0
    ret = evp_keyex_on_exchange(&ctx, 1, secret, peerkey);
698
0
    assert(ctx == NULL);
699
700
0
Exit:
701
0
    if (ctx != NULL)
702
0
        evp_keyex_on_exchange(&ctx, 1, NULL, ptls_iovec_init(NULL, 0));
703
0
    if (ret != 0) {
704
0
        free(outpubkey->base);
705
0
        *outpubkey = ptls_iovec_init(NULL, 0);
706
0
    }
707
0
    return ret;
708
0
}
709
710
#endif
711
712
#if PTLS_OPENSSL_HAVE_X25519MLKEM768
713
714
struct st_x25519mlkem768_context_t {
715
    ptls_key_exchange_context_t super;
716
    uint8_t pubkey[MLKEM768_PUBLIC_KEY_BYTES + X25519_PUBLIC_VALUE_LEN];
717
    struct {
718
        uint8_t x25519[X25519_PRIVATE_KEY_LEN];
719
        struct MLKEM768_private_key mlkem;
720
    } privkey;
721
};
722
723
static int x25519mlkem768_on_exchange(ptls_key_exchange_context_t **_ctx, int release, ptls_iovec_t *secret,
724
                                      ptls_iovec_t ciphertext)
725
{
726
    struct st_x25519mlkem768_context_t *ctx = (void *)*_ctx;
727
    int ret;
728
729
    if (secret == NULL) {
730
        ret = 0;
731
        goto Exit;
732
    }
733
734
    *secret = ptls_iovec_init(NULL, 0);
735
736
    /* validate length */
737
    if (ciphertext.len != MLKEM768_CIPHERTEXT_BYTES + X25519_PUBLIC_VALUE_LEN) {
738
        ret = PTLS_ALERT_DECRYPT_ERROR;
739
        goto Exit;
740
    }
741
742
    /* appsocate memory */
743
    secret->len = MLKEM_SHARED_SECRET_BYTES + X25519_SHARED_KEY_LEN;
744
    if ((secret->base = malloc(secret->len)) == NULL) {
745
        ret = PTLS_ERROR_NO_MEMORY;
746
        goto Exit;
747
    }
748
749
    /* run key exchange */
750
    if (!MLKEM768_decap(secret->base, ciphertext.base, MLKEM768_CIPHERTEXT_BYTES, &ctx->privkey.mlkem) ||
751
        !X25519(secret->base + MLKEM_SHARED_SECRET_BYTES, ctx->privkey.x25519, ciphertext.base + MLKEM768_CIPHERTEXT_BYTES)) {
752
        ret = PTLS_ALERT_ILLEGAL_PARAMETER;
753
        goto Exit;
754
    }
755
    ret = 0;
756
757
Exit:
758
    if (secret != NULL && ret != 0) {
759
        free(secret->base);
760
        *secret = ptls_iovec_init(NULL, 0);
761
    }
762
    if (release) {
763
        ptls_clear_memory(&ctx->privkey, sizeof(ctx->privkey));
764
        free(ctx);
765
        *_ctx = NULL;
766
    }
767
    return ret;
768
}
769
770
static int x25519mlkem768_create(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **_ctx)
771
{
772
    struct st_x25519mlkem768_context_t *ctx = NULL;
773
774
    if ((ctx = malloc(sizeof(*ctx))) == NULL)
775
        return PTLS_ERROR_NO_MEMORY;
776
777
    ctx->super = (ptls_key_exchange_context_t){algo, ptls_iovec_init(ctx->pubkey, sizeof(ctx->pubkey)), x25519mlkem768_on_exchange};
778
    MLKEM768_generate_key(ctx->pubkey, NULL, &ctx->privkey.mlkem);
779
    X25519_keypair(ctx->pubkey + MLKEM768_PUBLIC_KEY_BYTES, ctx->privkey.x25519);
780
781
    *_ctx = &ctx->super;
782
    return 0;
783
}
784
785
static int x25519mlkem768_exchange(ptls_key_exchange_algorithm_t *algo, ptls_iovec_t *ciphertext, ptls_iovec_t *secret,
786
                                   ptls_iovec_t peerkey)
787
{
788
    struct {
789
        CBS cbs;
790
        struct MLKEM768_public_key key;
791
    } mlkem_peer;
792
    uint8_t x25519_privkey[X25519_PRIVATE_KEY_LEN];
793
    int ret;
794
795
    *ciphertext = ptls_iovec_init(NULL, 0);
796
    *secret = ptls_iovec_init(NULL, 0);
797
798
    /* validate input length */
799
    if (peerkey.len != MLKEM768_PUBLIC_KEY_BYTES + X25519_PUBLIC_VALUE_LEN) {
800
        ret = PTLS_ALERT_DECODE_ERROR;
801
        goto Exit;
802
    }
803
804
    /* allocate memory */
805
    ciphertext->len = MLKEM768_CIPHERTEXT_BYTES + X25519_PUBLIC_VALUE_LEN;
806
    if ((ciphertext->base = malloc(ciphertext->len)) == NULL) {
807
        ret = PTLS_ERROR_NO_MEMORY;
808
        goto Exit;
809
    }
810
    secret->len = MLKEM_SHARED_SECRET_BYTES + X25519_SHARED_KEY_LEN;
811
    if ((secret->base = malloc(secret->len)) == NULL) {
812
        ret = PTLS_ERROR_NO_MEMORY;
813
        goto Exit;
814
    }
815
816
    /* run key exchange */
817
    CBS_init(&mlkem_peer.cbs, peerkey.base, MLKEM768_PUBLIC_KEY_BYTES);
818
    X25519_keypair(ciphertext->base + MLKEM768_CIPHERTEXT_BYTES, x25519_privkey);
819
    if (!MLKEM768_parse_public_key(&mlkem_peer.key, &mlkem_peer.cbs) ||
820
        !X25519(secret->base + MLKEM_SHARED_SECRET_BYTES, x25519_privkey, peerkey.base + MLKEM768_PUBLIC_KEY_BYTES)) {
821
        ret = PTLS_ALERT_ILLEGAL_PARAMETER;
822
        goto Exit;
823
    }
824
    MLKEM768_encap(ciphertext->base, secret->base, &mlkem_peer.key);
825
826
    ret = 0;
827
828
Exit:
829
    if (ret != 0) {
830
        free(ciphertext->base);
831
        *ciphertext = ptls_iovec_init(NULL, 0);
832
        free(secret->base);
833
        *secret = ptls_iovec_init(NULL, 0);
834
    }
835
    ptls_clear_memory(&x25519_privkey, sizeof(x25519_privkey));
836
    return ret;
837
}
838
839
#endif
840
841
int ptls_openssl_create_key_exchange(ptls_key_exchange_context_t **ctx, EVP_PKEY *pkey)
842
0
{
843
0
    int ret, id;
844
845
0
    switch (id = EVP_PKEY_id(pkey)) {
846
847
0
    case EVP_PKEY_EC: {
848
        /* obtain eckey */
849
0
        EC_KEY *eckey = EVP_PKEY_get1_EC_KEY(pkey);
850
851
        /* determine algo */
852
0
        ptls_key_exchange_algorithm_t *algo;
853
0
        switch (EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey))) {
854
0
        case NID_X9_62_prime256v1:
855
0
            algo = &ptls_openssl_secp256r1;
856
0
            break;
857
0
#if PTLS_OPENSSL_HAVE_SECP384R1
858
0
        case NID_secp384r1:
859
0
            algo = &ptls_openssl_secp384r1;
860
0
            break;
861
0
#endif
862
0
#if PTLS_OPENSSL_HAVE_SECP521R1
863
0
        case NID_secp521r1:
864
0
            algo = &ptls_openssl_secp521r1;
865
0
            break;
866
0
#endif
867
0
        default:
868
0
            EC_KEY_free(eckey);
869
0
            return PTLS_ERROR_INCOMPATIBLE_KEY;
870
0
        }
871
872
        /* load key */
873
0
        if ((ret = x9_62_init_key(algo, ctx, eckey)) != 0) {
874
0
            EC_KEY_free(eckey);
875
0
            return ret;
876
0
        }
877
878
0
        return 0;
879
0
    } break;
880
881
0
#if PTLS_OPENSSL_HAVE_X25519
882
0
    case NID_X25519:
883
0
        if ((ret = evp_keyex_init(&ptls_openssl_x25519, ctx, pkey)) != 0)
884
0
            return ret;
885
0
        EVP_PKEY_up_ref(pkey);
886
0
        return 0;
887
0
#endif
888
889
0
    default:
890
0
        return PTLS_ERROR_INCOMPATIBLE_KEY;
891
0
    }
892
0
}
893
894
#if PTLS_OPENSSL_HAVE_ASYNC
895
896
struct async_sign_ctx {
897
    ptls_async_job_t super;
898
    const ptls_openssl_signature_scheme_t *scheme;
899
    EVP_MD_CTX *ctx;
900
    ASYNC_WAIT_CTX *waitctx;
901
    ASYNC_JOB *job;
902
    size_t siglen;
903
    uint8_t sig[0]; // must be last, see `async_sign_ctx_new`
904
};
905
906
static void async_sign_ctx_free(ptls_async_job_t *_self)
907
0
{
908
0
    struct async_sign_ctx *self = (void *)_self;
909
910
    /* Once the async operation is complete, the user might call `ptls_free` instead of `ptls_handshake`. In such case, to avoid
911
     * desynchronization, let the backend read the result from the socket. The code below is a loop, but it is not going to block;
912
     * it is the responsibility of the user to refrain from calling `ptls_free` until the asynchronous operation is complete. */
913
0
    if (self->job != NULL) {
914
0
        int ret;
915
0
        while (ASYNC_start_job(&self->job, self->waitctx, &ret, NULL, NULL, 0) == ASYNC_PAUSE)
916
0
            ;
917
0
    }
918
919
0
    EVP_MD_CTX_destroy(self->ctx);
920
0
    ASYNC_WAIT_CTX_free(self->waitctx);
921
0
    free(self);
922
0
}
923
924
int async_sign_ctx_get_fd(ptls_async_job_t *_self)
925
0
{
926
0
    struct async_sign_ctx *self = (void *)_self;
927
0
    OSSL_ASYNC_FD fds[1];
928
0
    size_t numfds;
929
930
0
    ASYNC_WAIT_CTX_get_all_fds(self->waitctx, NULL, &numfds);
931
0
    assert(numfds == 1);
932
0
    ASYNC_WAIT_CTX_get_all_fds(self->waitctx, fds, &numfds);
933
0
    return (int)fds[0];
934
0
}
935
936
static ptls_async_job_t *async_sign_ctx_new(const ptls_openssl_signature_scheme_t *scheme, EVP_MD_CTX *ctx, size_t siglen)
937
0
{
938
0
    struct async_sign_ctx *self;
939
940
0
    if ((self = malloc(offsetof(struct async_sign_ctx, sig) + siglen)) == NULL)
941
0
        return NULL;
942
943
0
    self->super = (ptls_async_job_t){async_sign_ctx_free, async_sign_ctx_get_fd};
944
0
    self->scheme = scheme;
945
0
    self->ctx = ctx;
946
0
    self->waitctx = ASYNC_WAIT_CTX_new();
947
0
    self->job = NULL;
948
0
    self->siglen = siglen;
949
0
    memset(self->sig, 0, siglen);
950
951
0
    return &self->super;
952
0
}
953
954
static int do_sign_async_job(void *_async)
955
0
{
956
0
    struct async_sign_ctx *async = *(struct async_sign_ctx **)_async;
957
0
    return EVP_DigestSignFinal(async->ctx, async->sig, &async->siglen);
958
0
}
959
960
static int do_sign_async(ptls_buffer_t *outbuf, ptls_async_job_t **_async)
961
0
{
962
0
    struct async_sign_ctx *async = (void *)*_async;
963
0
    int ret;
964
965
0
    switch (ASYNC_start_job(&async->job, async->waitctx, &ret, do_sign_async_job, &async, sizeof(async))) {
966
0
    case ASYNC_PAUSE:
967
0
        return PTLS_ERROR_ASYNC_OPERATION; // async operation inflight; bail out without getting rid of async context
968
0
    case ASYNC_ERR:
969
0
        ret = PTLS_ERROR_LIBRARY;
970
0
        break;
971
0
    case ASYNC_NO_JOBS:
972
0
        ret = PTLS_ERROR_LIBRARY;
973
0
        break;
974
0
    case ASYNC_FINISH:
975
0
        async->job = NULL;
976
0
        ptls_buffer_pushv(outbuf, async->sig, async->siglen);
977
0
        ret = 0;
978
0
        break;
979
0
    default:
980
0
        ret = PTLS_ERROR_LIBRARY;
981
0
        break;
982
0
    }
983
984
0
Exit:
985
0
    async_sign_ctx_free(&async->super);
986
0
    *_async = NULL;
987
0
    return ret;
988
0
}
989
990
#endif
991
992
static int do_sign(EVP_PKEY *key, const ptls_openssl_signature_scheme_t *scheme, ptls_buffer_t *outbuf, ptls_iovec_t input,
993
                   ptls_async_job_t **async)
994
0
{
995
0
    EVP_MD_CTX *ctx = NULL;
996
0
    const EVP_MD *md = scheme->scheme_md != NULL ? scheme->scheme_md() : NULL;
997
0
    EVP_PKEY_CTX *pkey_ctx;
998
0
    size_t siglen;
999
0
    int ret;
1000
1001
0
    if ((ctx = EVP_MD_CTX_create()) == NULL) {
1002
0
        ret = PTLS_ERROR_NO_MEMORY;
1003
0
        goto Exit;
1004
0
    }
1005
1006
0
    if (EVP_DigestSignInit(ctx, &pkey_ctx, md, NULL, key) != 1) {
1007
0
        ret = PTLS_ERROR_LIBRARY;
1008
0
        goto Exit;
1009
0
    }
1010
1011
0
#if PTLS_OPENSSL_HAVE_ED25519
1012
0
    if (EVP_PKEY_id(key) == EVP_PKEY_ED25519) {
1013
        /* ED25519 requires the use of the all-at-once function that appeared in OpenSSL 1.1.1, hence different path */
1014
0
        if (EVP_DigestSign(ctx, NULL, &siglen, input.base, input.len) != 1) {
1015
0
            ret = PTLS_ERROR_LIBRARY;
1016
0
            goto Exit;
1017
0
        }
1018
0
        if ((ret = ptls_buffer_reserve(outbuf, siglen)) != 0)
1019
0
            goto Exit;
1020
0
        if (EVP_DigestSign(ctx, outbuf->base + outbuf->off, &siglen, input.base, input.len) != 1) {
1021
0
            ret = PTLS_ERROR_LIBRARY;
1022
0
            goto Exit;
1023
0
        }
1024
0
    } else
1025
0
#endif
1026
0
    {
1027
0
        if (EVP_PKEY_id(key) == EVP_PKEY_RSA) {
1028
0
            if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING) != 1) {
1029
0
                ret = PTLS_ERROR_LIBRARY;
1030
0
                goto Exit;
1031
0
            }
1032
0
            if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, -1) != 1) {
1033
0
                ret = PTLS_ERROR_LIBRARY;
1034
0
                goto Exit;
1035
0
            }
1036
0
            if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, md) != 1) {
1037
0
                ret = PTLS_ERROR_LIBRARY;
1038
0
                goto Exit;
1039
0
            }
1040
0
        }
1041
0
        if (EVP_DigestSignUpdate(ctx, input.base, input.len) != 1) {
1042
0
            ret = PTLS_ERROR_LIBRARY;
1043
0
            goto Exit;
1044
0
        }
1045
0
        if (EVP_DigestSignFinal(ctx, NULL, &siglen) != 1) {
1046
0
            ret = PTLS_ERROR_LIBRARY;
1047
0
            goto Exit;
1048
0
        }
1049
        /* If permitted by the caller (by providing a non-NULL `async` slot), use the asynchronous signing method and return
1050
         * immediately. */
1051
0
#if PTLS_OPENSSL_HAVE_ASYNC
1052
0
        if (async != NULL) {
1053
0
            if ((*async = async_sign_ctx_new(scheme, ctx, siglen)) == NULL) {
1054
0
                ret = PTLS_ERROR_NO_MEMORY;
1055
0
                goto Exit;
1056
0
            }
1057
0
            return do_sign_async(outbuf, async);
1058
0
        }
1059
0
#endif
1060
        /* Otherwise, generate signature synchronously. */
1061
0
        if ((ret = ptls_buffer_reserve(outbuf, siglen)) != 0)
1062
0
            goto Exit;
1063
0
        if (EVP_DigestSignFinal(ctx, outbuf->base + outbuf->off, &siglen) != 1) {
1064
0
            ret = PTLS_ERROR_LIBRARY;
1065
0
            goto Exit;
1066
0
        }
1067
0
    }
1068
1069
0
    outbuf->off += siglen;
1070
1071
0
    ret = 0;
1072
0
Exit:
1073
0
    if (ctx != NULL)
1074
0
        EVP_MD_CTX_destroy(ctx);
1075
0
    return ret;
1076
0
}
1077
1078
struct cipher_context_t {
1079
    ptls_cipher_context_t super;
1080
    EVP_CIPHER_CTX *evp;
1081
};
1082
1083
static void cipher_dispose(ptls_cipher_context_t *_ctx)
1084
0
{
1085
0
    struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
1086
0
    EVP_CIPHER_CTX_free(ctx->evp);
1087
0
}
1088
1089
static void cipher_do_init(ptls_cipher_context_t *_ctx, const void *iv)
1090
0
{
1091
0
    struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
1092
0
    int ret;
1093
0
    ret = EVP_EncryptInit_ex(ctx->evp, NULL, NULL, NULL, iv);
1094
0
    assert(ret);
1095
0
}
1096
1097
static int cipher_setup_crypto(ptls_cipher_context_t *_ctx, int is_enc, const void *key, const EVP_CIPHER *cipher,
1098
                               void (*do_transform)(ptls_cipher_context_t *, void *, const void *, size_t))
1099
0
{
1100
0
    struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
1101
1102
0
    ctx->super.do_dispose = cipher_dispose;
1103
0
    ctx->super.do_init = cipher_do_init;
1104
0
    ctx->super.do_transform = do_transform;
1105
1106
0
    if ((ctx->evp = EVP_CIPHER_CTX_new()) == NULL)
1107
0
        return PTLS_ERROR_NO_MEMORY;
1108
1109
0
    if (is_enc) {
1110
0
        if (!EVP_EncryptInit_ex(ctx->evp, cipher, NULL, key, NULL))
1111
0
            goto Error;
1112
0
    } else {
1113
0
        if (!EVP_DecryptInit_ex(ctx->evp, cipher, NULL, key, NULL))
1114
0
            goto Error;
1115
0
        EVP_CIPHER_CTX_set_padding(ctx->evp, 0); /* required to disable one block buffering in ECB mode */
1116
0
    }
1117
1118
0
    return 0;
1119
0
Error:
1120
0
    EVP_CIPHER_CTX_free(ctx->evp);
1121
0
    return PTLS_ERROR_LIBRARY;
1122
0
}
1123
1124
static void cipher_encrypt(ptls_cipher_context_t *_ctx, void *output, const void *input, size_t _len)
1125
0
{
1126
0
    struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
1127
0
    int len = (int)_len, ret = EVP_EncryptUpdate(ctx->evp, output, &len, input, len);
1128
0
    assert(ret);
1129
0
    assert(len == (int)_len);
1130
0
}
1131
1132
static void cipher_decrypt(ptls_cipher_context_t *_ctx, void *output, const void *input, size_t _len)
1133
0
{
1134
0
    struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
1135
0
    int len = (int)_len, ret = EVP_DecryptUpdate(ctx->evp, output, &len, input, len);
1136
0
    assert(ret);
1137
0
    assert(len == (int)_len);
1138
0
}
1139
1140
static int aes128ecb_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1141
0
{
1142
0
    return cipher_setup_crypto(ctx, is_enc, key, EVP_aes_128_ecb(), is_enc ? cipher_encrypt : cipher_decrypt);
1143
0
}
1144
1145
static int aes256ecb_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1146
0
{
1147
0
    return cipher_setup_crypto(ctx, is_enc, key, EVP_aes_256_ecb(), is_enc ? cipher_encrypt : cipher_decrypt);
1148
0
}
1149
1150
static int aes128ctr_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1151
0
{
1152
0
    return cipher_setup_crypto(ctx, 1, key, EVP_aes_128_ctr(), cipher_encrypt);
1153
0
}
1154
1155
static int aes256ctr_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1156
0
{
1157
0
    return cipher_setup_crypto(ctx, 1, key, EVP_aes_256_ctr(), cipher_encrypt);
1158
0
}
1159
1160
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
1161
#ifdef OPENSSL_IS_BORINGSSL
1162
1163
struct boringssl_chacha20_context_t {
1164
    ptls_cipher_context_t super;
1165
    uint8_t key[PTLS_CHACHA20_KEY_SIZE];
1166
    uint8_t iv[12];
1167
    struct {
1168
        uint32_t ctr;
1169
        uint8_t bytes[64];
1170
        size_t len;
1171
    } keystream;
1172
};
1173
1174
static void boringssl_chacha20_dispose(ptls_cipher_context_t *_ctx)
1175
{
1176
    struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
1177
1178
    ptls_clear_memory(ctx->key, sizeof(ctx->key));
1179
    ptls_clear_memory(ctx->iv, sizeof(ctx->iv));
1180
    ptls_clear_memory(ctx->keystream.bytes, sizeof(ctx->keystream.bytes));
1181
}
1182
1183
static void boringssl_chacha20_init(ptls_cipher_context_t *_ctx, const void *_iv)
1184
{
1185
    struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
1186
    const uint8_t *iv = _iv;
1187
1188
    memcpy(ctx->iv, iv + 4, sizeof(ctx->iv));
1189
    ctx->keystream.ctr = iv[0] | ((uint32_t)iv[1] << 8) | ((uint32_t)iv[2] << 16) | ((uint32_t)iv[3] << 24);
1190
    ctx->keystream.len = 0;
1191
}
1192
1193
static inline void boringssl_chacha20_transform_buffered(struct boringssl_chacha20_context_t *ctx, uint8_t **output,
1194
                                                         const uint8_t **input, size_t *len)
1195
{
1196
    size_t apply_len = *len < ctx->keystream.len ? *len : ctx->keystream.len;
1197
    const uint8_t *ks = ctx->keystream.bytes + sizeof(ctx->keystream.bytes) - ctx->keystream.len;
1198
    ctx->keystream.len -= apply_len;
1199
1200
    *len -= apply_len;
1201
    for (size_t i = 0; i < apply_len; ++i)
1202
        *(*output)++ = *(*input)++ ^ *ks++;
1203
}
1204
1205
static void boringssl_chacha20_transform(ptls_cipher_context_t *_ctx, void *_output, const void *_input, size_t len)
1206
{
1207
    struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
1208
    uint8_t *output = _output;
1209
    const uint8_t *input = _input;
1210
1211
    if (len == 0)
1212
        return;
1213
1214
    if (ctx->keystream.len != 0) {
1215
        boringssl_chacha20_transform_buffered(ctx, &output, &input, &len);
1216
        if (len == 0)
1217
            return;
1218
    }
1219
1220
    assert(ctx->keystream.len == 0);
1221
1222
    if (len >= sizeof(ctx->keystream.bytes)) {
1223
        size_t blocks = len / CHACHA20POLY1305_BLOCKSIZE;
1224
        CRYPTO_chacha_20(output, input, blocks * CHACHA20POLY1305_BLOCKSIZE, ctx->key, ctx->iv, ctx->keystream.ctr);
1225
        ctx->keystream.ctr += blocks;
1226
        output += blocks * CHACHA20POLY1305_BLOCKSIZE;
1227
        input += blocks * CHACHA20POLY1305_BLOCKSIZE;
1228
        len -= blocks * CHACHA20POLY1305_BLOCKSIZE;
1229
        if (len == 0)
1230
            return;
1231
    }
1232
1233
    memset(ctx->keystream.bytes, 0, CHACHA20POLY1305_BLOCKSIZE);
1234
    CRYPTO_chacha_20(ctx->keystream.bytes, ctx->keystream.bytes, CHACHA20POLY1305_BLOCKSIZE, ctx->key, ctx->iv,
1235
                     ctx->keystream.ctr++);
1236
    ctx->keystream.len = sizeof(ctx->keystream.bytes);
1237
1238
    boringssl_chacha20_transform_buffered(ctx, &output, &input, &len);
1239
    assert(len == 0);
1240
}
1241
1242
static int boringssl_chacha20_setup_crypto(ptls_cipher_context_t *_ctx, int is_enc, const void *key)
1243
{
1244
    struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
1245
1246
    ctx->super.do_dispose = boringssl_chacha20_dispose;
1247
    ctx->super.do_init = boringssl_chacha20_init;
1248
    ctx->super.do_transform = boringssl_chacha20_transform;
1249
    memcpy(ctx->key, key, sizeof(ctx->key));
1250
1251
    return 0;
1252
}
1253
1254
#else
1255
1256
static int chacha20_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1257
0
{
1258
0
    return cipher_setup_crypto(ctx, 1, key, EVP_chacha20(), cipher_encrypt);
1259
0
}
1260
1261
#endif
1262
#endif
1263
1264
#if PTLS_OPENSSL_HAVE_BF
1265
1266
static int bfecb_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1267
0
{
1268
0
    return cipher_setup_crypto(ctx, is_enc, key, EVP_bf_ecb(), is_enc ? cipher_encrypt : cipher_decrypt);
1269
0
}
1270
1271
#endif
1272
1273
struct aead_crypto_context_t {
1274
    ptls_aead_context_t super;
1275
    EVP_CIPHER_CTX *evp_ctx;
1276
    uint8_t static_iv[PTLS_MAX_IV_SIZE];
1277
};
1278
1279
static void aead_dispose_crypto(ptls_aead_context_t *_ctx)
1280
1.84k
{
1281
1.84k
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1282
1283
1.84k
    if (ctx->evp_ctx != NULL)
1284
1.84k
        EVP_CIPHER_CTX_free(ctx->evp_ctx);
1285
1.84k
}
1286
1287
static void aead_get_iv(ptls_aead_context_t *_ctx, void *iv)
1288
0
{
1289
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1290
1291
0
    memcpy(iv, ctx->static_iv, ctx->super.algo->iv_size);
1292
0
}
1293
1294
static void aead_set_iv(ptls_aead_context_t *_ctx, const void *iv)
1295
0
{
1296
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1297
1298
0
    memcpy(ctx->static_iv, iv, ctx->super.algo->iv_size);
1299
0
}
1300
1301
static void aead_do_encrypt_init(ptls_aead_context_t *_ctx, uint64_t seq, const void *aad, size_t aadlen)
1302
0
{
1303
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1304
0
    uint8_t iv[PTLS_MAX_IV_SIZE];
1305
0
    int ret;
1306
1307
0
    ptls_aead__build_iv(ctx->super.algo, iv, ctx->static_iv, seq);
1308
0
    ret = EVP_EncryptInit_ex(ctx->evp_ctx, NULL, NULL, NULL, iv);
1309
0
    assert(ret);
1310
1311
0
    if (aadlen != 0) {
1312
0
        int blocklen;
1313
0
        ret = EVP_EncryptUpdate(ctx->evp_ctx, NULL, &blocklen, aad, (int)aadlen);
1314
0
        assert(ret);
1315
0
    }
1316
0
}
1317
1318
static size_t aead_do_encrypt_update(ptls_aead_context_t *_ctx, void *output, const void *input, size_t inlen)
1319
0
{
1320
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1321
0
    int blocklen, ret;
1322
1323
0
    ret = EVP_EncryptUpdate(ctx->evp_ctx, output, &blocklen, input, (int)inlen);
1324
0
    assert(ret);
1325
1326
0
    return blocklen;
1327
0
}
1328
1329
static size_t aead_do_encrypt_final(ptls_aead_context_t *_ctx, void *_output)
1330
0
{
1331
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1332
0
    uint8_t *output = _output;
1333
0
    size_t off = 0, tag_size = ctx->super.algo->tag_size;
1334
0
    int blocklen, ret;
1335
1336
0
    ret = EVP_EncryptFinal_ex(ctx->evp_ctx, output + off, &blocklen);
1337
0
    assert(ret);
1338
0
    off += blocklen;
1339
0
    ret = EVP_CIPHER_CTX_ctrl(ctx->evp_ctx, EVP_CTRL_GCM_GET_TAG, (int)tag_size, output + off);
1340
0
    assert(ret);
1341
0
    off += tag_size;
1342
1343
0
    return off;
1344
0
}
1345
1346
static size_t aead_do_decrypt(ptls_aead_context_t *_ctx, void *_output, const void *input, size_t inlen, uint64_t seq,
1347
                              const void *aad, size_t aadlen)
1348
0
{
1349
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1350
0
    uint8_t *output = _output, iv[PTLS_MAX_IV_SIZE];
1351
0
    size_t off = 0, tag_size = ctx->super.algo->tag_size;
1352
0
    int blocklen, ret;
1353
1354
0
    if (inlen < tag_size)
1355
0
        return SIZE_MAX;
1356
1357
0
    ptls_aead__build_iv(ctx->super.algo, iv, ctx->static_iv, seq);
1358
0
    ret = EVP_DecryptInit_ex(ctx->evp_ctx, NULL, NULL, NULL, iv);
1359
0
    assert(ret);
1360
0
    if (aadlen != 0) {
1361
0
        ret = EVP_DecryptUpdate(ctx->evp_ctx, NULL, &blocklen, aad, (int)aadlen);
1362
0
        assert(ret);
1363
0
    }
1364
0
    ret = EVP_DecryptUpdate(ctx->evp_ctx, output + off, &blocklen, input, (int)(inlen - tag_size));
1365
0
    assert(ret);
1366
0
    off += blocklen;
1367
0
    if (!EVP_CIPHER_CTX_ctrl(ctx->evp_ctx, EVP_CTRL_GCM_SET_TAG, (int)tag_size, (void *)((uint8_t *)input + inlen - tag_size)))
1368
0
        return SIZE_MAX;
1369
0
    if (!EVP_DecryptFinal_ex(ctx->evp_ctx, output + off, &blocklen))
1370
0
        return SIZE_MAX;
1371
0
    off += blocklen;
1372
1373
0
    return off;
1374
0
}
1375
1376
static int aead_setup_crypto(ptls_aead_context_t *_ctx, int is_enc, const void *key, const void *iv, const EVP_CIPHER *cipher)
1377
1.84k
{
1378
1.84k
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1379
1.84k
    int ret;
1380
1381
1.84k
    ctx->super.dispose_crypto = aead_dispose_crypto;
1382
1.84k
    ctx->super.do_get_iv = aead_get_iv;
1383
1.84k
    ctx->super.do_set_iv = aead_set_iv;
1384
1.84k
    if (is_enc) {
1385
924
        ctx->super.do_encrypt_init = aead_do_encrypt_init;
1386
924
        ctx->super.do_encrypt_update = aead_do_encrypt_update;
1387
924
        ctx->super.do_encrypt_final = aead_do_encrypt_final;
1388
924
        ctx->super.do_encrypt = ptls_aead__do_encrypt;
1389
924
        ctx->super.do_encrypt_v = ptls_aead__do_encrypt_v;
1390
924
        ctx->super.do_decrypt = NULL;
1391
924
    } else {
1392
924
        ctx->super.do_encrypt_init = NULL;
1393
924
        ctx->super.do_encrypt_update = NULL;
1394
924
        ctx->super.do_encrypt_final = NULL;
1395
924
        ctx->super.do_encrypt = NULL;
1396
924
        ctx->super.do_encrypt_v = NULL;
1397
924
        ctx->super.do_decrypt = aead_do_decrypt;
1398
924
    }
1399
1.84k
    ctx->evp_ctx = NULL;
1400
1401
1.84k
    if ((ctx->evp_ctx = EVP_CIPHER_CTX_new()) == NULL) {
1402
0
        ret = PTLS_ERROR_NO_MEMORY;
1403
0
        goto Error;
1404
0
    }
1405
1.84k
    if (is_enc) {
1406
924
        if (!EVP_EncryptInit_ex(ctx->evp_ctx, cipher, NULL, key, NULL)) {
1407
0
            ret = PTLS_ERROR_LIBRARY;
1408
0
            goto Error;
1409
0
        }
1410
924
    } else {
1411
924
        if (!EVP_DecryptInit_ex(ctx->evp_ctx, cipher, NULL, key, NULL)) {
1412
0
            ret = PTLS_ERROR_LIBRARY;
1413
0
            goto Error;
1414
0
        }
1415
924
    }
1416
1.84k
    if (!EVP_CIPHER_CTX_ctrl(ctx->evp_ctx, EVP_CTRL_GCM_SET_IVLEN, (int)ctx->super.algo->iv_size, NULL)) {
1417
0
        ret = PTLS_ERROR_LIBRARY;
1418
0
        goto Error;
1419
0
    }
1420
1421
1.84k
    memcpy(ctx->static_iv, iv, ctx->super.algo->iv_size);
1422
1423
1.84k
    return 0;
1424
1425
0
Error:
1426
0
    aead_dispose_crypto(&ctx->super);
1427
0
    return ret;
1428
1.84k
}
1429
1430
static int aead_aes128gcm_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
1431
1.84k
{
1432
1.84k
    return aead_setup_crypto(ctx, is_enc, key, iv, EVP_aes_128_gcm());
1433
1.84k
}
1434
1435
static int aead_aes256gcm_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
1436
0
{
1437
0
    return aead_setup_crypto(ctx, is_enc, key, iv, EVP_aes_256_gcm());
1438
0
}
1439
1440
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
1441
#ifdef OPENSSL_IS_BORINGSSL
1442
1443
struct boringssl_chacha20poly1305_context_t {
1444
    struct chacha20poly1305_context_t super;
1445
    poly1305_state poly1305;
1446
};
1447
1448
static void boringssl_poly1305_init(struct chacha20poly1305_context_t *_ctx, const void *key)
1449
{
1450
    struct boringssl_chacha20poly1305_context_t *ctx = (struct boringssl_chacha20poly1305_context_t *)_ctx;
1451
    CRYPTO_poly1305_init(&ctx->poly1305, key);
1452
}
1453
1454
static void boringssl_poly1305_update(struct chacha20poly1305_context_t *_ctx, const void *input, size_t len)
1455
{
1456
    struct boringssl_chacha20poly1305_context_t *ctx = (struct boringssl_chacha20poly1305_context_t *)_ctx;
1457
    CRYPTO_poly1305_update(&ctx->poly1305, input, len);
1458
}
1459
1460
static void boringssl_poly1305_finish(struct chacha20poly1305_context_t *_ctx, void *tag)
1461
{
1462
    struct boringssl_chacha20poly1305_context_t *ctx = (struct boringssl_chacha20poly1305_context_t *)_ctx;
1463
    CRYPTO_poly1305_finish(&ctx->poly1305, tag);
1464
}
1465
1466
static int boringssl_chacha20poly1305_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
1467
{
1468
    return chacha20poly1305_setup_crypto(ctx, is_enc, key, iv, &ptls_openssl_chacha20, boringssl_poly1305_init,
1469
                                         boringssl_poly1305_update, boringssl_poly1305_finish);
1470
}
1471
1472
#else
1473
1474
static int aead_chacha20poly1305_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
1475
0
{
1476
0
    return aead_setup_crypto(ctx, is_enc, key, iv, EVP_chacha20_poly1305());
1477
0
}
1478
1479
#endif
1480
#endif
1481
1482
56.1k
#define _sha256_final(ctx, md) SHA256_Final((md), (ctx))
1483
56.1k
ptls_define_hash(sha256, SHA256_CTX, SHA256_Init, SHA256_Update, _sha256_final);
1484
1485
0
#define _sha384_final(ctx, md) SHA384_Final((md), (ctx))
1486
0
ptls_define_hash(sha384, SHA512_CTX, SHA384_Init, SHA384_Update, _sha384_final);
1487
1488
0
#define _sha512_final(ctx, md) SHA512_Final((md), (ctx))
1489
0
ptls_define_hash(sha512, SHA512_CTX, SHA512_Init, SHA512_Update, _sha512_final);
1490
1491
static int sign_certificate(ptls_sign_certificate_t *_self, ptls_t *tls, ptls_async_job_t **async, uint16_t *selected_algorithm,
1492
                            ptls_buffer_t *outbuf, ptls_iovec_t input, const uint16_t *algorithms, size_t num_algorithms)
1493
0
{
1494
0
    ptls_openssl_sign_certificate_t *self = (ptls_openssl_sign_certificate_t *)_self;
1495
0
    const ptls_openssl_signature_scheme_t *scheme;
1496
1497
    /* Just resume the asynchronous operation, if one is in flight. */
1498
0
#if PTLS_OPENSSL_HAVE_ASYNC
1499
0
    if (async != NULL && *async != NULL) {
1500
0
        struct async_sign_ctx *sign_ctx = (struct async_sign_ctx *)(*async);
1501
0
        *selected_algorithm = sign_ctx->scheme->scheme_id;
1502
0
        return do_sign_async(outbuf, async);
1503
0
    }
1504
0
#endif
1505
1506
    /* Select the algorithm or return failure if none found. */
1507
0
    if ((scheme = ptls_openssl_select_signature_scheme(self->schemes, algorithms, num_algorithms)) == NULL)
1508
0
        return PTLS_ALERT_HANDSHAKE_FAILURE;
1509
0
    *selected_algorithm = scheme->scheme_id;
1510
1511
0
#if PTLS_OPENSSL_HAVE_ASYNC
1512
0
    if (!self->async && async != NULL) {
1513
        /* indicate to `do_sign` that async mode is disabled for this operation */
1514
0
        assert(*async == NULL);
1515
0
        async = NULL;
1516
0
    }
1517
0
#endif
1518
0
    return do_sign(self->key, scheme, outbuf, input, async);
1519
0
}
1520
1521
static X509 *to_x509(ptls_iovec_t vec)
1522
0
{
1523
0
    const uint8_t *p = vec.base;
1524
0
    return d2i_X509(NULL, &p, (long)vec.len);
1525
0
}
1526
1527
static int verify_sign(void *verify_ctx, uint16_t algo, ptls_iovec_t data, ptls_iovec_t signature)
1528
0
{
1529
0
    EVP_PKEY *key = verify_ctx;
1530
0
    const ptls_openssl_signature_scheme_t *scheme;
1531
0
    EVP_MD_CTX *ctx = NULL;
1532
0
    EVP_PKEY_CTX *pkey_ctx = NULL;
1533
0
    int ret = 0;
1534
1535
0
    if (data.base == NULL)
1536
0
        goto Exit;
1537
1538
0
    if ((scheme = ptls_openssl_lookup_signature_schemes(key)) == NULL) {
1539
0
        ret = PTLS_ERROR_LIBRARY;
1540
0
        goto Exit;
1541
0
    }
1542
0
    for (; scheme->scheme_id != UINT16_MAX; ++scheme)
1543
0
        if (scheme->scheme_id == algo)
1544
0
            goto SchemeFound;
1545
0
    ret = PTLS_ALERT_ILLEGAL_PARAMETER;
1546
0
    goto Exit;
1547
1548
0
SchemeFound:
1549
0
    if ((ctx = EVP_MD_CTX_create()) == NULL) {
1550
0
        ret = PTLS_ERROR_NO_MEMORY;
1551
0
        goto Exit;
1552
0
    }
1553
1554
0
#if PTLS_OPENSSL_HAVE_ED25519
1555
0
    if (EVP_PKEY_id(key) == EVP_PKEY_ED25519) {
1556
        /* ED25519 requires the use of the all-at-once function that appeared in OpenSSL 1.1.1, hence different path */
1557
0
        if (EVP_DigestVerifyInit(ctx, &pkey_ctx, NULL, NULL, key) != 1) {
1558
0
            ret = PTLS_ERROR_LIBRARY;
1559
0
            goto Exit;
1560
0
        }
1561
0
        if (EVP_DigestVerify(ctx, signature.base, signature.len, data.base, data.len) != 1) {
1562
0
            ret = PTLS_ERROR_LIBRARY;
1563
0
            goto Exit;
1564
0
        }
1565
0
    } else
1566
0
#endif
1567
0
    {
1568
0
        if (EVP_DigestVerifyInit(ctx, &pkey_ctx, scheme->scheme_md(), NULL, key) != 1) {
1569
0
            ret = PTLS_ERROR_LIBRARY;
1570
0
            goto Exit;
1571
0
        }
1572
1573
0
        if (EVP_PKEY_id(key) == EVP_PKEY_RSA) {
1574
0
            if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING) != 1) {
1575
0
                ret = PTLS_ERROR_LIBRARY;
1576
0
                goto Exit;
1577
0
            }
1578
0
            if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, -1) != 1) {
1579
0
                ret = PTLS_ERROR_LIBRARY;
1580
0
                goto Exit;
1581
0
            }
1582
0
            if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, scheme->scheme_md()) != 1) {
1583
0
                ret = PTLS_ERROR_LIBRARY;
1584
0
                goto Exit;
1585
0
            }
1586
0
        }
1587
0
        if (EVP_DigestVerifyUpdate(ctx, data.base, data.len) != 1) {
1588
0
            ret = PTLS_ERROR_LIBRARY;
1589
0
            goto Exit;
1590
0
        }
1591
0
        if (EVP_DigestVerifyFinal(ctx, signature.base, signature.len) != 1) {
1592
0
            ret = PTLS_ALERT_DECRYPT_ERROR;
1593
0
            goto Exit;
1594
0
        }
1595
0
    }
1596
1597
0
    ret = 0;
1598
1599
0
Exit:
1600
0
    if (ctx != NULL)
1601
0
        EVP_MD_CTX_destroy(ctx);
1602
0
    EVP_PKEY_free(key);
1603
0
    return ret;
1604
0
}
1605
1606
int ptls_openssl_init_sign_certificate(ptls_openssl_sign_certificate_t *self, EVP_PKEY *key)
1607
0
{
1608
0
    *self = (ptls_openssl_sign_certificate_t){.super = {sign_certificate}, .async = 0 /* libssl has it off by default too */};
1609
1610
0
    if ((self->schemes = ptls_openssl_lookup_signature_schemes(key)) == NULL)
1611
0
        return PTLS_ERROR_INCOMPATIBLE_KEY;
1612
0
    EVP_PKEY_up_ref(key);
1613
0
    self->key = key;
1614
1615
0
    return 0;
1616
0
}
1617
1618
void ptls_openssl_dispose_sign_certificate(ptls_openssl_sign_certificate_t *self)
1619
0
{
1620
0
    EVP_PKEY_free(self->key);
1621
0
}
1622
1623
static int serialize_cert(X509 *cert, ptls_iovec_t *dst)
1624
0
{
1625
0
    int len = i2d_X509(cert, NULL);
1626
0
    assert(len > 0);
1627
1628
0
    if ((dst->base = malloc(len)) == NULL)
1629
0
        return PTLS_ERROR_NO_MEMORY;
1630
0
    unsigned char *p = dst->base;
1631
0
    dst->len = i2d_X509(cert, &p);
1632
0
    assert(len == dst->len);
1633
1634
0
    return 0;
1635
0
}
1636
1637
int ptls_openssl_load_certificates(ptls_context_t *ctx, X509 *cert, STACK_OF(X509) * chain)
1638
0
{
1639
0
    ptls_iovec_t *list = NULL;
1640
0
    size_t slot = 0, count = (cert != NULL) + (chain != NULL ? sk_X509_num(chain) : 0);
1641
0
    int ret;
1642
1643
0
    assert(ctx->certificates.list == NULL);
1644
1645
0
    if ((list = malloc(sizeof(*list) * count)) == NULL) {
1646
0
        ret = PTLS_ERROR_NO_MEMORY;
1647
0
        goto Exit;
1648
0
    }
1649
0
    if (cert != NULL) {
1650
0
        if ((ret = serialize_cert(cert, list + slot++)) != 0)
1651
0
            goto Exit;
1652
0
    }
1653
0
    if (chain != NULL) {
1654
0
        int i;
1655
0
        for (i = 0; i != sk_X509_num(chain); ++i) {
1656
0
            if ((ret = serialize_cert(sk_X509_value(chain, i), list + slot++)) != 0)
1657
0
                goto Exit;
1658
0
        }
1659
0
    }
1660
1661
0
    assert(slot == count);
1662
1663
0
    ctx->certificates.list = list;
1664
0
    ctx->certificates.count = count;
1665
0
    ret = 0;
1666
1667
0
Exit:
1668
0
    if (ret != 0 && list != NULL) {
1669
0
        size_t i;
1670
0
        for (i = 0; i != slot; ++i)
1671
0
            free(list[i].base);
1672
0
        free(list);
1673
0
    }
1674
0
    return ret;
1675
0
}
1676
1677
static int verify_cert_chain(X509_STORE *store, X509 *cert, STACK_OF(X509) * chain, int is_server, const char *server_name,
1678
                             int *ossl_x509_err)
1679
0
{
1680
0
    X509_STORE_CTX *verify_ctx;
1681
0
    int ret;
1682
0
    *ossl_x509_err = 0;
1683
1684
    /* verify certificate chain */
1685
0
    if ((verify_ctx = X509_STORE_CTX_new()) == NULL) {
1686
0
        ret = PTLS_ERROR_NO_MEMORY;
1687
0
        goto Exit;
1688
0
    }
1689
0
    if (X509_STORE_CTX_init(verify_ctx, store, cert, chain) != 1) {
1690
0
        ret = PTLS_ERROR_LIBRARY;
1691
0
        goto Exit;
1692
0
    }
1693
1694
0
    { /* setup verify params */
1695
0
        X509_VERIFY_PARAM *params = X509_STORE_CTX_get0_param(verify_ctx);
1696
0
        X509_VERIFY_PARAM_set_purpose(params, is_server ? X509_PURPOSE_SSL_CLIENT : X509_PURPOSE_SSL_SERVER);
1697
0
        X509_VERIFY_PARAM_set_depth(params, 98); /* use the default of OpenSSL 1.0.2 and above; see `man SSL_CTX_set_verify` */
1698
        /* when _acting_ as client, set the server name if provided*/
1699
0
        if (!is_server && server_name != NULL) {
1700
0
            if (ptls_server_name_is_ipaddr(server_name)) {
1701
0
                X509_VERIFY_PARAM_set1_ip_asc(params, server_name);
1702
0
            } else {
1703
0
                X509_VERIFY_PARAM_set1_host(params, server_name, strlen(server_name));
1704
0
                X509_VERIFY_PARAM_set_hostflags(params, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
1705
0
            }
1706
0
        }
1707
0
    }
1708
1709
0
    if (X509_verify_cert(verify_ctx) != 1) {
1710
0
        *ossl_x509_err = X509_STORE_CTX_get_error(verify_ctx);
1711
0
        switch (*ossl_x509_err) {
1712
0
        case X509_V_ERR_OUT_OF_MEM:
1713
0
            ret = PTLS_ERROR_NO_MEMORY;
1714
0
            break;
1715
0
        case X509_V_ERR_CERT_REVOKED:
1716
0
            ret = PTLS_ALERT_CERTIFICATE_REVOKED;
1717
0
            break;
1718
0
        case X509_V_ERR_CERT_NOT_YET_VALID:
1719
0
        case X509_V_ERR_CERT_HAS_EXPIRED:
1720
0
            ret = PTLS_ALERT_CERTIFICATE_EXPIRED;
1721
0
            break;
1722
0
        case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
1723
0
        case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
1724
0
        case X509_V_ERR_CERT_UNTRUSTED:
1725
0
        case X509_V_ERR_CERT_REJECTED:
1726
0
            ret = PTLS_ALERT_UNKNOWN_CA;
1727
0
            break;
1728
0
        case X509_V_ERR_HOSTNAME_MISMATCH:
1729
0
        case X509_V_ERR_INVALID_CA:
1730
0
            ret = PTLS_ALERT_BAD_CERTIFICATE;
1731
0
            break;
1732
0
        default:
1733
0
            ret = PTLS_ALERT_CERTIFICATE_UNKNOWN;
1734
0
            break;
1735
0
        }
1736
0
        goto Exit;
1737
0
    }
1738
1739
0
    ret = 0;
1740
1741
0
Exit:
1742
0
    if (verify_ctx != NULL)
1743
0
        X509_STORE_CTX_free(verify_ctx);
1744
0
    return ret;
1745
0
}
1746
1747
static int verify_cert(ptls_verify_certificate_t *_self, ptls_t *tls, const char *server_name,
1748
                       int (**verifier)(void *, uint16_t, ptls_iovec_t, ptls_iovec_t), void **verify_data, ptls_iovec_t *certs,
1749
                       size_t num_certs)
1750
0
{
1751
0
    ptls_openssl_verify_certificate_t *self = (ptls_openssl_verify_certificate_t *)_self;
1752
0
    X509 *cert = NULL;
1753
0
    STACK_OF(X509) *chain = sk_X509_new_null();
1754
0
    size_t i;
1755
0
    int ossl_x509_err, ret;
1756
1757
    /* If any certs are given, convert them to OpenSSL representation, then verify the cert chain. If no certs are given, just give
1758
     * the override_callback to see if we want to stay fail open. */
1759
0
    if (num_certs != 0) {
1760
0
        if ((cert = to_x509(certs[0])) == NULL) {
1761
0
            ret = PTLS_ALERT_BAD_CERTIFICATE;
1762
0
            goto Exit;
1763
0
        }
1764
0
        for (i = 1; i != num_certs; ++i) {
1765
0
            X509 *interm = to_x509(certs[i]);
1766
0
            if (interm == NULL) {
1767
0
                ret = PTLS_ALERT_BAD_CERTIFICATE;
1768
0
                goto Exit;
1769
0
            }
1770
0
            sk_X509_push(chain, interm);
1771
0
        }
1772
0
        ret = verify_cert_chain(self->cert_store, cert, chain, ptls_is_server(tls), server_name, &ossl_x509_err);
1773
0
    } else {
1774
0
        ret = PTLS_ALERT_CERTIFICATE_REQUIRED;
1775
0
        ossl_x509_err = 0;
1776
0
    }
1777
1778
    /* When override callback is available, let it override the error. */
1779
0
    if (self->override_callback != NULL)
1780
0
        ret = self->override_callback->cb(self->override_callback, tls, ret, ossl_x509_err, cert, chain);
1781
1782
0
    if (ret != 0 || num_certs == 0)
1783
0
        goto Exit;
1784
1785
    /* extract public key for verifying the TLS handshake signature */
1786
0
    if ((*verify_data = X509_get_pubkey(cert)) == NULL) {
1787
0
        ret = PTLS_ALERT_BAD_CERTIFICATE;
1788
0
        goto Exit;
1789
0
    }
1790
0
    *verifier = verify_sign;
1791
1792
0
Exit:
1793
0
    if (chain != NULL)
1794
0
        sk_X509_pop_free(chain, X509_free);
1795
0
    if (cert != NULL)
1796
0
        X509_free(cert);
1797
0
    return ret;
1798
0
}
1799
1800
int ptls_openssl_init_verify_certificate(ptls_openssl_verify_certificate_t *self, X509_STORE *store)
1801
0
{
1802
0
    *self = (ptls_openssl_verify_certificate_t){{verify_cert, default_signature_schemes}, NULL};
1803
1804
0
    if (store != NULL) {
1805
0
        X509_STORE_up_ref(store);
1806
0
        self->cert_store = store;
1807
0
    } else {
1808
        /* use default store */
1809
0
        if ((self->cert_store = ptls_openssl_create_default_certificate_store()) == NULL)
1810
0
            return -1;
1811
0
    }
1812
1813
0
    return 0;
1814
0
}
1815
1816
void ptls_openssl_dispose_verify_certificate(ptls_openssl_verify_certificate_t *self)
1817
0
{
1818
0
    X509_STORE_free(self->cert_store);
1819
0
}
1820
1821
X509_STORE *ptls_openssl_create_default_certificate_store(void)
1822
0
{
1823
0
    X509_STORE *store;
1824
0
    X509_LOOKUP *lookup;
1825
1826
0
    if ((store = X509_STORE_new()) == NULL)
1827
0
        goto Error;
1828
0
    if ((lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file())) == NULL)
1829
0
        goto Error;
1830
0
    X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT);
1831
0
    if ((lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir())) == NULL)
1832
0
        goto Error;
1833
0
    X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
1834
1835
0
    return store;
1836
0
Error:
1837
0
    if (store != NULL)
1838
0
        X509_STORE_free(store);
1839
0
    return NULL;
1840
0
}
1841
1842
static int verify_raw_cert(ptls_verify_certificate_t *_self, ptls_t *tls, const char *server_name,
1843
                           int (**verifier)(void *, uint16_t algo, ptls_iovec_t, ptls_iovec_t), void **verify_data,
1844
                           ptls_iovec_t *certs, size_t num_certs)
1845
0
{
1846
0
    ptls_openssl_raw_pubkey_verify_certificate_t *self = (ptls_openssl_raw_pubkey_verify_certificate_t *)_self;
1847
0
    int ret = PTLS_ALERT_BAD_CERTIFICATE;
1848
0
    ptls_iovec_t expected_pubkey = {0};
1849
1850
0
    assert(num_certs != 0);
1851
1852
0
    if (num_certs != 1)
1853
0
        goto Exit;
1854
1855
0
    int r = i2d_PUBKEY(self->expected_pubkey, &expected_pubkey.base);
1856
0
    if (r <= 0) {
1857
0
        ret = PTLS_ALERT_BAD_CERTIFICATE;
1858
0
        goto Exit;
1859
0
    }
1860
1861
0
    expected_pubkey.len = r;
1862
0
    if (certs[0].len != expected_pubkey.len)
1863
0
        goto Exit;
1864
1865
0
    if (!ptls_mem_equal(expected_pubkey.base, certs[0].base, certs[0].len))
1866
0
        goto Exit;
1867
1868
0
    EVP_PKEY_up_ref(self->expected_pubkey);
1869
0
    *verify_data = self->expected_pubkey;
1870
0
    *verifier = verify_sign;
1871
0
    ret = 0;
1872
0
Exit:
1873
0
    OPENSSL_free(expected_pubkey.base);
1874
0
    return ret;
1875
0
}
1876
1877
int ptls_openssl_raw_pubkey_init_verify_certificate(ptls_openssl_raw_pubkey_verify_certificate_t *self, EVP_PKEY *expected_pubkey)
1878
0
{
1879
0
    EVP_PKEY_up_ref(expected_pubkey);
1880
0
    *self = (ptls_openssl_raw_pubkey_verify_certificate_t){{verify_raw_cert, default_signature_schemes}, expected_pubkey};
1881
0
    return 0;
1882
0
}
1883
void ptls_openssl_raw_pubkey_dispose_verify_certificate(ptls_openssl_raw_pubkey_verify_certificate_t *self)
1884
0
{
1885
0
    EVP_PKEY_free(self->expected_pubkey);
1886
0
}
1887
1888
0
#define TICKET_LABEL_SIZE 16
1889
0
#define TICKET_IV_SIZE EVP_MAX_IV_LENGTH
1890
1891
int ptls_openssl_encrypt_ticket(ptls_buffer_t *buf, ptls_iovec_t src,
1892
                                int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc))
1893
0
{
1894
0
    EVP_CIPHER_CTX *cctx = NULL;
1895
0
    HMAC_CTX *hctx = NULL;
1896
0
    uint8_t *dst;
1897
0
    int clen, ret;
1898
1899
0
    if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
1900
0
        ret = PTLS_ERROR_NO_MEMORY;
1901
0
        goto Exit;
1902
0
    }
1903
0
    if ((hctx = HMAC_CTX_new()) == NULL) {
1904
0
        ret = PTLS_ERROR_NO_MEMORY;
1905
0
        goto Exit;
1906
0
    }
1907
1908
0
    if ((ret = ptls_buffer_reserve(buf, TICKET_LABEL_SIZE + TICKET_IV_SIZE + src.len + EVP_MAX_BLOCK_LENGTH + EVP_MAX_MD_SIZE)) !=
1909
0
        0)
1910
0
        goto Exit;
1911
0
    dst = buf->base + buf->off;
1912
1913
    /* fill label and iv, as well as obtaining the keys */
1914
0
    if (!(*cb)(dst, dst + TICKET_LABEL_SIZE, cctx, hctx, 1)) {
1915
0
        ret = PTLS_ERROR_LIBRARY;
1916
0
        goto Exit;
1917
0
    }
1918
0
    dst += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
1919
1920
    /* encrypt */
1921
0
    if (!EVP_EncryptUpdate(cctx, dst, &clen, src.base, (int)src.len)) {
1922
0
        ret = PTLS_ERROR_LIBRARY;
1923
0
        goto Exit;
1924
0
    }
1925
0
    dst += clen;
1926
0
    if (!EVP_EncryptFinal_ex(cctx, dst, &clen)) {
1927
0
        ret = PTLS_ERROR_LIBRARY;
1928
0
        goto Exit;
1929
0
    }
1930
0
    dst += clen;
1931
1932
    /* append hmac */
1933
0
    if (!HMAC_Update(hctx, buf->base + buf->off, dst - (buf->base + buf->off)) || !HMAC_Final(hctx, dst, NULL)) {
1934
0
        ret = PTLS_ERROR_LIBRARY;
1935
0
        goto Exit;
1936
0
    }
1937
0
    dst += HMAC_size(hctx);
1938
1939
0
    assert(dst <= buf->base + buf->capacity);
1940
0
    buf->off += dst - (buf->base + buf->off);
1941
0
    ret = 0;
1942
1943
0
Exit:
1944
0
    if (cctx != NULL)
1945
0
        EVP_CIPHER_CTX_free(cctx);
1946
0
    if (hctx != NULL)
1947
0
        HMAC_CTX_free(hctx);
1948
0
    return ret;
1949
0
}
1950
1951
int ptls_openssl_decrypt_ticket(ptls_buffer_t *buf, ptls_iovec_t src,
1952
                                int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc))
1953
0
{
1954
0
    EVP_CIPHER_CTX *cctx = NULL;
1955
0
    HMAC_CTX *hctx = NULL;
1956
0
    int clen, ret;
1957
1958
0
    if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
1959
0
        ret = PTLS_ERROR_NO_MEMORY;
1960
0
        goto Exit;
1961
0
    }
1962
0
    if ((hctx = HMAC_CTX_new()) == NULL) {
1963
0
        ret = PTLS_ERROR_NO_MEMORY;
1964
0
        goto Exit;
1965
0
    }
1966
1967
    /* obtain cipher and hash context.
1968
     * Note: no need to handle renew, since in picotls we always send a new ticket to minimize the chance of ticket reuse */
1969
0
    if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE) {
1970
0
        ret = PTLS_ALERT_DECODE_ERROR;
1971
0
        goto Exit;
1972
0
    }
1973
0
    if (!(*cb)(src.base, src.base + TICKET_LABEL_SIZE, cctx, hctx, 0)) {
1974
0
        ret = PTLS_ERROR_LIBRARY;
1975
0
        goto Exit;
1976
0
    }
1977
1978
    /* check hmac, and exclude label, iv, hmac */
1979
0
    size_t hmac_size = HMAC_size(hctx);
1980
0
    if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE + hmac_size) {
1981
0
        ret = PTLS_ALERT_DECODE_ERROR;
1982
0
        goto Exit;
1983
0
    }
1984
0
    src.len -= hmac_size;
1985
0
    uint8_t hmac[EVP_MAX_MD_SIZE];
1986
0
    if (!HMAC_Update(hctx, src.base, src.len) || !HMAC_Final(hctx, hmac, NULL)) {
1987
0
        ret = PTLS_ERROR_LIBRARY;
1988
0
        goto Exit;
1989
0
    }
1990
0
    if (!ptls_mem_equal(src.base + src.len, hmac, hmac_size)) {
1991
0
        ret = PTLS_ALERT_HANDSHAKE_FAILURE;
1992
0
        goto Exit;
1993
0
    }
1994
0
    src.base += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
1995
0
    src.len -= TICKET_LABEL_SIZE + TICKET_IV_SIZE;
1996
1997
    /* decrypt */
1998
0
    if ((ret = ptls_buffer_reserve(buf, src.len)) != 0)
1999
0
        goto Exit;
2000
0
    if (!EVP_DecryptUpdate(cctx, buf->base + buf->off, &clen, src.base, (int)src.len)) {
2001
0
        ret = PTLS_ERROR_LIBRARY;
2002
0
        goto Exit;
2003
0
    }
2004
0
    buf->off += clen;
2005
0
    if (!EVP_DecryptFinal_ex(cctx, buf->base + buf->off, &clen)) {
2006
0
        ret = PTLS_ERROR_LIBRARY;
2007
0
        goto Exit;
2008
0
    }
2009
0
    buf->off += clen;
2010
2011
0
    ret = 0;
2012
2013
0
Exit:
2014
0
    if (cctx != NULL)
2015
0
        EVP_CIPHER_CTX_free(cctx);
2016
0
    if (hctx != NULL)
2017
0
        HMAC_CTX_free(hctx);
2018
0
    return ret;
2019
0
}
2020
2021
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2022
int ptls_openssl_encrypt_ticket_evp(ptls_buffer_t *buf, ptls_iovec_t src,
2023
                                    int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, EVP_MAC_CTX *hctx,
2024
                                              int enc))
2025
{
2026
    EVP_CIPHER_CTX *cctx = NULL;
2027
    EVP_MAC *mac = NULL;
2028
    EVP_MAC_CTX *hctx = NULL;
2029
    size_t hlen;
2030
    uint8_t *dst;
2031
    int clen, ret;
2032
2033
    if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
2034
        ret = PTLS_ERROR_NO_MEMORY;
2035
        goto Exit;
2036
    }
2037
    if ((mac = EVP_MAC_fetch(NULL, "HMAC", NULL)) == NULL) {
2038
        ret = PTLS_ERROR_NO_MEMORY;
2039
        goto Exit;
2040
    }
2041
    if ((hctx = EVP_MAC_CTX_new(mac)) == NULL) {
2042
        ret = PTLS_ERROR_NO_MEMORY;
2043
        goto Exit;
2044
    }
2045
2046
    if ((ret = ptls_buffer_reserve(buf, TICKET_LABEL_SIZE + TICKET_IV_SIZE + src.len + EVP_MAX_BLOCK_LENGTH + EVP_MAX_MD_SIZE)) !=
2047
        0)
2048
        goto Exit;
2049
    dst = buf->base + buf->off;
2050
2051
    /* fill label and iv, as well as obtaining the keys */
2052
    if (!(*cb)(dst, dst + TICKET_LABEL_SIZE, cctx, hctx, 1)) {
2053
        ret = PTLS_ERROR_LIBRARY;
2054
        goto Exit;
2055
    }
2056
    dst += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
2057
2058
    /* encrypt */
2059
    if (!EVP_EncryptUpdate(cctx, dst, &clen, src.base, (int)src.len)) {
2060
        ret = PTLS_ERROR_LIBRARY;
2061
        goto Exit;
2062
    }
2063
    dst += clen;
2064
    if (!EVP_EncryptFinal_ex(cctx, dst, &clen)) {
2065
        ret = PTLS_ERROR_LIBRARY;
2066
        goto Exit;
2067
    }
2068
    dst += clen;
2069
2070
    /* append hmac */
2071
    if (!EVP_MAC_update(hctx, buf->base + buf->off, dst - (buf->base + buf->off)) ||
2072
        !EVP_MAC_final(hctx, dst, &hlen, EVP_MAC_CTX_get_mac_size(hctx))) {
2073
        ret = PTLS_ERROR_LIBRARY;
2074
        goto Exit;
2075
    }
2076
    dst += hlen;
2077
2078
    assert(dst <= buf->base + buf->capacity);
2079
    buf->off += dst - (buf->base + buf->off);
2080
    ret = 0;
2081
2082
Exit:
2083
    if (cctx != NULL)
2084
        EVP_CIPHER_CTX_free(cctx);
2085
    if (hctx != NULL)
2086
        EVP_MAC_CTX_free(hctx);
2087
    if (mac != NULL)
2088
        EVP_MAC_free(mac);
2089
    return ret;
2090
}
2091
2092
int ptls_openssl_decrypt_ticket_evp(ptls_buffer_t *buf, ptls_iovec_t src,
2093
                                    int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, EVP_MAC_CTX *hctx,
2094
                                              int enc))
2095
{
2096
    EVP_CIPHER_CTX *cctx = NULL;
2097
    EVP_MAC *mac = NULL;
2098
    EVP_MAC_CTX *hctx = NULL;
2099
    size_t hlen;
2100
    int clen, ret;
2101
2102
    if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
2103
        ret = PTLS_ERROR_NO_MEMORY;
2104
        goto Exit;
2105
    }
2106
    if ((mac = EVP_MAC_fetch(NULL, "HMAC", NULL)) == NULL) {
2107
        ret = PTLS_ERROR_NO_MEMORY;
2108
        goto Exit;
2109
    }
2110
    if ((hctx = EVP_MAC_CTX_new(mac)) == NULL) {
2111
        ret = PTLS_ERROR_NO_MEMORY;
2112
        goto Exit;
2113
    }
2114
2115
    /* obtain cipher and hash context.
2116
     * Note: no need to handle renew, since in picotls we always send a new ticket to minimize the chance of ticket reuse */
2117
    if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE) {
2118
        ret = PTLS_ALERT_DECODE_ERROR;
2119
        goto Exit;
2120
    }
2121
    if (!(*cb)(src.base, src.base + TICKET_LABEL_SIZE, cctx, hctx, 0)) {
2122
        ret = PTLS_ERROR_LIBRARY;
2123
        goto Exit;
2124
    }
2125
2126
    /* check hmac, and exclude label, iv, hmac */
2127
    size_t hmac_size = EVP_MAC_CTX_get_mac_size(hctx);
2128
    if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE + hmac_size) {
2129
        ret = PTLS_ALERT_DECODE_ERROR;
2130
        goto Exit;
2131
    }
2132
    src.len -= hmac_size;
2133
    uint8_t hmac[EVP_MAX_MD_SIZE];
2134
    if (!EVP_MAC_update(hctx, src.base, src.len) || !EVP_MAC_final(hctx, hmac, &hlen, sizeof(hmac))) {
2135
        ret = PTLS_ERROR_LIBRARY;
2136
        goto Exit;
2137
    }
2138
    if (!ptls_mem_equal(src.base + src.len, hmac, hmac_size)) {
2139
        ret = PTLS_ALERT_HANDSHAKE_FAILURE;
2140
        goto Exit;
2141
    }
2142
    src.base += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
2143
    src.len -= TICKET_LABEL_SIZE + TICKET_IV_SIZE;
2144
2145
    /* decrypt */
2146
    if ((ret = ptls_buffer_reserve(buf, src.len)) != 0)
2147
        goto Exit;
2148
    if (!EVP_DecryptUpdate(cctx, buf->base + buf->off, &clen, src.base, (int)src.len)) {
2149
        ret = PTLS_ERROR_LIBRARY;
2150
        goto Exit;
2151
    }
2152
    buf->off += clen;
2153
    if (!EVP_DecryptFinal_ex(cctx, buf->base + buf->off, &clen)) {
2154
        ret = PTLS_ERROR_LIBRARY;
2155
        goto Exit;
2156
    }
2157
    buf->off += clen;
2158
2159
    ret = 0;
2160
2161
Exit:
2162
    if (cctx != NULL)
2163
        EVP_CIPHER_CTX_free(cctx);
2164
    if (hctx != NULL)
2165
        EVP_MAC_CTX_free(hctx);
2166
    if (mac != NULL)
2167
        EVP_MAC_free(mac);
2168
    return ret;
2169
}
2170
#endif
2171
2172
ptls_key_exchange_algorithm_t ptls_openssl_secp256r1 = {.id = PTLS_GROUP_SECP256R1,
2173
                                                        .name = PTLS_GROUP_NAME_SECP256R1,
2174
                                                        .create = x9_62_create_key_exchange,
2175
                                                        .exchange = secp_key_exchange,
2176
                                                        .data = NID_X9_62_prime256v1};
2177
#if PTLS_OPENSSL_HAVE_SECP384R1
2178
ptls_key_exchange_algorithm_t ptls_openssl_secp384r1 = {.id = PTLS_GROUP_SECP384R1,
2179
                                                        .name = PTLS_GROUP_NAME_SECP384R1,
2180
                                                        .create = x9_62_create_key_exchange,
2181
                                                        .exchange = secp_key_exchange,
2182
                                                        .data = NID_secp384r1};
2183
#endif
2184
#if PTLS_OPENSSL_HAVE_SECP521R1
2185
ptls_key_exchange_algorithm_t ptls_openssl_secp521r1 = {.id = PTLS_GROUP_SECP521R1,
2186
                                                        .name = PTLS_GROUP_NAME_SECP521R1,
2187
                                                        .create = x9_62_create_key_exchange,
2188
                                                        .exchange = secp_key_exchange,
2189
                                                        .data = NID_secp521r1};
2190
#endif
2191
#if PTLS_OPENSSL_HAVE_X25519
2192
ptls_key_exchange_algorithm_t ptls_openssl_x25519 = {.id = PTLS_GROUP_X25519,
2193
                                                     .name = PTLS_GROUP_NAME_X25519,
2194
                                                     .create = evp_keyex_create,
2195
                                                     .exchange = evp_keyex_exchange,
2196
                                                     .data = NID_X25519};
2197
#endif
2198
#if PTLS_OPENSSL_HAVE_X25519MLKEM768
2199
ptls_key_exchange_algorithm_t ptls_openssl_x25519mlkem768 = {.id = PTLS_GROUP_X25519MLKEM768,
2200
                                                             .name = PTLS_GROUP_NAME_X25519MLKEM768,
2201
                                                             .create = x25519mlkem768_create,
2202
                                                             .exchange = x25519mlkem768_exchange};
2203
#endif
2204
ptls_key_exchange_algorithm_t *ptls_openssl_key_exchanges[] = {&ptls_openssl_secp256r1, NULL};
2205
ptls_key_exchange_algorithm_t *ptls_openssl_key_exchanges_all[] = {
2206
#if PTLS_OPENSSL_HAVE_X25519MLKEM768
2207
    &ptls_openssl_x25519mlkem768,
2208
#endif
2209
#if PTLS_OPENSSL_HAVE_SECP521R1
2210
    &ptls_openssl_secp521r1,
2211
#endif
2212
#if PTLS_OPENSSL_HAVE_SECP384R1
2213
    &ptls_openssl_secp384r1,
2214
#endif
2215
#if PTLS_OPENSSL_HAVE_X25519
2216
    &ptls_openssl_x25519,
2217
#endif
2218
    &ptls_openssl_secp256r1,      NULL};
2219
ptls_cipher_algorithm_t ptls_openssl_aes128ecb = {
2220
    "AES128-ECB",          PTLS_AES128_KEY_SIZE, PTLS_AES_BLOCK_SIZE, 0 /* iv size */, sizeof(struct cipher_context_t),
2221
    aes128ecb_setup_crypto};
2222
ptls_cipher_algorithm_t ptls_openssl_aes128ctr = {
2223
    "AES128-CTR", PTLS_AES128_KEY_SIZE, 1, PTLS_AES_IV_SIZE, sizeof(struct cipher_context_t), aes128ctr_setup_crypto};
2224
ptls_aead_algorithm_t ptls_openssl_aes128gcm = {"AES128-GCM",
2225
                                                PTLS_AESGCM_CONFIDENTIALITY_LIMIT,
2226
                                                PTLS_AESGCM_INTEGRITY_LIMIT,
2227
                                                &ptls_openssl_aes128ctr,
2228
                                                &ptls_openssl_aes128ecb,
2229
                                                PTLS_AES128_KEY_SIZE,
2230
                                                PTLS_AESGCM_IV_SIZE,
2231
                                                PTLS_AESGCM_TAG_SIZE,
2232
                                                {PTLS_TLS12_AESGCM_FIXED_IV_SIZE, PTLS_TLS12_AESGCM_RECORD_IV_SIZE},
2233
                                                0,
2234
                                                0,
2235
                                                sizeof(struct aead_crypto_context_t),
2236
                                                aead_aes128gcm_setup_crypto};
2237
ptls_cipher_algorithm_t ptls_openssl_aes256ecb = {
2238
    "AES256-ECB",          PTLS_AES256_KEY_SIZE, PTLS_AES_BLOCK_SIZE, 0 /* iv size */, sizeof(struct cipher_context_t),
2239
    aes256ecb_setup_crypto};
2240
ptls_cipher_algorithm_t ptls_openssl_aes256ctr = {
2241
    "AES256-CTR",          PTLS_AES256_KEY_SIZE, 1 /* block size */, PTLS_AES_IV_SIZE, sizeof(struct cipher_context_t),
2242
    aes256ctr_setup_crypto};
2243
ptls_aead_algorithm_t ptls_openssl_aes256gcm = {"AES256-GCM",
2244
                                                PTLS_AESGCM_CONFIDENTIALITY_LIMIT,
2245
                                                PTLS_AESGCM_INTEGRITY_LIMIT,
2246
                                                &ptls_openssl_aes256ctr,
2247
                                                &ptls_openssl_aes256ecb,
2248
                                                PTLS_AES256_KEY_SIZE,
2249
                                                PTLS_AESGCM_IV_SIZE,
2250
                                                PTLS_AESGCM_TAG_SIZE,
2251
                                                {PTLS_TLS12_AESGCM_FIXED_IV_SIZE, PTLS_TLS12_AESGCM_RECORD_IV_SIZE},
2252
                                                0,
2253
                                                0,
2254
                                                sizeof(struct aead_crypto_context_t),
2255
                                                aead_aes256gcm_setup_crypto};
2256
ptls_hash_algorithm_t ptls_openssl_sha256 = {"sha256", PTLS_SHA256_BLOCK_SIZE, PTLS_SHA256_DIGEST_SIZE, sha256_create,
2257
                                             PTLS_ZERO_DIGEST_SHA256};
2258
ptls_hash_algorithm_t ptls_openssl_sha384 = {"sha384", PTLS_SHA384_BLOCK_SIZE, PTLS_SHA384_DIGEST_SIZE, sha384_create,
2259
                                             PTLS_ZERO_DIGEST_SHA384};
2260
ptls_hash_algorithm_t ptls_openssl_sha512 = {"sha512", PTLS_SHA512_BLOCK_SIZE, PTLS_SHA512_DIGEST_SIZE, sha512_create,
2261
                                             PTLS_ZERO_DIGEST_SHA512};
2262
ptls_cipher_suite_t ptls_openssl_aes128gcmsha256 = {.id = PTLS_CIPHER_SUITE_AES_128_GCM_SHA256,
2263
                                                    .name = PTLS_CIPHER_SUITE_NAME_AES_128_GCM_SHA256,
2264
                                                    .aead = &ptls_openssl_aes128gcm,
2265
                                                    .hash = &ptls_openssl_sha256};
2266
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_rsa_aes128gcmsha256 = {.id = PTLS_CIPHER_SUITE_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
2267
                                                                    .name =
2268
                                                                        PTLS_CIPHER_SUITE_NAME_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
2269
                                                                    .aead = &ptls_openssl_aes128gcm,
2270
                                                                    .hash = &ptls_openssl_sha256};
2271
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_ecdsa_aes128gcmsha256 = {
2272
    .id = PTLS_CIPHER_SUITE_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
2273
    .name = PTLS_CIPHER_SUITE_NAME_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
2274
    .aead = &ptls_openssl_aes128gcm,
2275
    .hash = &ptls_openssl_sha256};
2276
ptls_cipher_suite_t ptls_openssl_aes256gcmsha384 = {.id = PTLS_CIPHER_SUITE_AES_256_GCM_SHA384,
2277
                                                    .name = PTLS_CIPHER_SUITE_NAME_AES_256_GCM_SHA384,
2278
                                                    .aead = &ptls_openssl_aes256gcm,
2279
                                                    .hash = &ptls_openssl_sha384};
2280
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_rsa_aes256gcmsha384 = {.id = PTLS_CIPHER_SUITE_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
2281
                                                                    .name =
2282
                                                                        PTLS_CIPHER_SUITE_NAME_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
2283
                                                                    .aead = &ptls_openssl_aes256gcm,
2284
                                                                    .hash = &ptls_openssl_sha384};
2285
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_ecdsa_aes256gcmsha384 = {
2286
    .id = PTLS_CIPHER_SUITE_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
2287
    .name = PTLS_CIPHER_SUITE_NAME_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
2288
    .aead = &ptls_openssl_aes256gcm,
2289
    .hash = &ptls_openssl_sha384};
2290
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2291
ptls_cipher_algorithm_t ptls_openssl_chacha20 = {
2292
    .name = "CHACHA20",
2293
    .key_size = PTLS_CHACHA20_KEY_SIZE,
2294
    .block_size = 1,
2295
    .iv_size = PTLS_CHACHA20_IV_SIZE,
2296
#ifdef OPENSSL_IS_BORINGSSL
2297
    .context_size = sizeof(struct boringssl_chacha20_context_t),
2298
    .setup_crypto = boringssl_chacha20_setup_crypto,
2299
#else
2300
    .context_size = sizeof(struct cipher_context_t),
2301
    .setup_crypto = chacha20_setup_crypto,
2302
#endif
2303
};
2304
ptls_aead_algorithm_t ptls_openssl_chacha20poly1305 = {
2305
    .name = "CHACHA20-POLY1305",
2306
    .confidentiality_limit = PTLS_CHACHA20POLY1305_CONFIDENTIALITY_LIMIT,
2307
    .integrity_limit = PTLS_CHACHA20POLY1305_INTEGRITY_LIMIT,
2308
    .ctr_cipher = &ptls_openssl_chacha20,
2309
    .ecb_cipher = NULL,
2310
    .key_size = PTLS_CHACHA20_KEY_SIZE,
2311
    .iv_size = PTLS_CHACHA20POLY1305_IV_SIZE,
2312
    .tag_size = PTLS_CHACHA20POLY1305_TAG_SIZE,
2313
    .tls12 = {.fixed_iv_size = PTLS_TLS12_CHACHAPOLY_FIXED_IV_SIZE, .record_iv_size = PTLS_TLS12_CHACHAPOLY_RECORD_IV_SIZE},
2314
    .non_temporal = 0,
2315
    .align_bits = 0,
2316
#ifdef OPENSSL_IS_BORINGSSL
2317
    .context_size = sizeof(struct boringssl_chacha20poly1305_context_t),
2318
    .setup_crypto = boringssl_chacha20poly1305_setup_crypto,
2319
#else
2320
    .context_size = sizeof(struct aead_crypto_context_t),
2321
    .setup_crypto = aead_chacha20poly1305_setup_crypto,
2322
#endif
2323
};
2324
ptls_cipher_suite_t ptls_openssl_chacha20poly1305sha256 = {.id = PTLS_CIPHER_SUITE_CHACHA20_POLY1305_SHA256,
2325
                                                           .name = PTLS_CIPHER_SUITE_NAME_CHACHA20_POLY1305_SHA256,
2326
                                                           .aead = &ptls_openssl_chacha20poly1305,
2327
                                                           .hash = &ptls_openssl_sha256};
2328
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_rsa_chacha20poly1305sha256 = {
2329
    .id = PTLS_CIPHER_SUITE_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
2330
    .name = PTLS_CIPHER_SUITE_NAME_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
2331
    .aead = &ptls_openssl_chacha20poly1305,
2332
    .hash = &ptls_openssl_sha256};
2333
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_ecdsa_chacha20poly1305sha256 = {
2334
    .id = PTLS_CIPHER_SUITE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
2335
    .name = PTLS_CIPHER_SUITE_NAME_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
2336
    .aead = &ptls_openssl_chacha20poly1305,
2337
    .hash = &ptls_openssl_sha256};
2338
#endif
2339
2340
#if PTLS_HAVE_AEGIS
2341
ptls_aead_algorithm_t ptls_openssl_aegis128l = {
2342
    .name = "AEGIS-128L",
2343
    .confidentiality_limit = PTLS_AEGIS128L_CONFIDENTIALITY_LIMIT,
2344
    .integrity_limit = PTLS_AEGIS128L_INTEGRITY_LIMIT,
2345
    .ctr_cipher = NULL,
2346
    .ecb_cipher = NULL,
2347
    .key_size = PTLS_AEGIS128L_KEY_SIZE,
2348
    .iv_size = PTLS_AEGIS128L_IV_SIZE,
2349
    .tag_size = PTLS_AEGIS128L_TAG_SIZE,
2350
    .tls12 = {.fixed_iv_size = 0, .record_iv_size = 0},
2351
    .non_temporal = 0,
2352
    .align_bits = 0,
2353
    .context_size = sizeof(struct aegis128l_context_t),
2354
    .setup_crypto = aegis128l_setup_crypto,
2355
};
2356
ptls_cipher_suite_t ptls_openssl_aegis128lsha256 = {.id = PTLS_CIPHER_SUITE_AEGIS128L_SHA256,
2357
                                                    .name = PTLS_CIPHER_SUITE_NAME_AEGIS128L_SHA256,
2358
                                                    .aead = &ptls_openssl_aegis128l,
2359
                                                    .hash = &ptls_openssl_sha256};
2360
2361
ptls_aead_algorithm_t ptls_openssl_aegis256 = {
2362
    .name = "AEGIS-256",
2363
    .confidentiality_limit = PTLS_AEGIS256_CONFIDENTIALITY_LIMIT,
2364
    .integrity_limit = PTLS_AEGIS256_INTEGRITY_LIMIT,
2365
    .ctr_cipher = NULL,
2366
    .ecb_cipher = NULL,
2367
    .key_size = PTLS_AEGIS256_KEY_SIZE,
2368
    .iv_size = PTLS_AEGIS256_IV_SIZE,
2369
    .tag_size = PTLS_AEGIS256_TAG_SIZE,
2370
    .tls12 = {.fixed_iv_size = 0, .record_iv_size = 0},
2371
    .non_temporal = 0,
2372
    .align_bits = 0,
2373
    .context_size = sizeof(struct aegis256_context_t),
2374
    .setup_crypto = aegis256_setup_crypto,
2375
};
2376
ptls_cipher_suite_t ptls_openssl_aegis256sha512 = {.id = PTLS_CIPHER_SUITE_AEGIS256_SHA512,
2377
                                                   .name = PTLS_CIPHER_SUITE_NAME_AEGIS256_SHA512,
2378
                                                   .aead = &ptls_openssl_aegis256,
2379
                                                   .hash = &ptls_openssl_sha512};
2380
#endif
2381
2382
ptls_cipher_suite_t *ptls_openssl_cipher_suites[] = { // ciphers used with sha384 (must be first)
2383
    &ptls_openssl_aes256gcmsha384,
2384
2385
    // ciphers used with sha256
2386
    &ptls_openssl_aes128gcmsha256,
2387
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2388
    &ptls_openssl_chacha20poly1305sha256,
2389
#endif
2390
    NULL};
2391
2392
ptls_cipher_suite_t *ptls_openssl_cipher_suites_all[] = { // ciphers used with sha384 (must be first)
2393
#if PTLS_HAVE_AEGIS
2394
    &ptls_openssl_aegis256sha512,
2395
#endif
2396
    &ptls_openssl_aes256gcmsha384,
2397
2398
// ciphers used with sha256
2399
#if PTLS_HAVE_AEGIS
2400
    &ptls_openssl_aegis128lsha256,
2401
#endif
2402
    &ptls_openssl_aes128gcmsha256,
2403
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2404
    &ptls_openssl_chacha20poly1305sha256,
2405
#endif
2406
    NULL};
2407
2408
ptls_cipher_suite_t *ptls_openssl_tls12_cipher_suites[] = {&ptls_openssl_tls12_ecdhe_rsa_aes128gcmsha256,
2409
                                                           &ptls_openssl_tls12_ecdhe_ecdsa_aes128gcmsha256,
2410
                                                           &ptls_openssl_tls12_ecdhe_rsa_aes256gcmsha384,
2411
                                                           &ptls_openssl_tls12_ecdhe_ecdsa_aes256gcmsha384,
2412
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2413
                                                           &ptls_openssl_tls12_ecdhe_rsa_chacha20poly1305sha256,
2414
                                                           &ptls_openssl_tls12_ecdhe_ecdsa_chacha20poly1305sha256,
2415
#endif
2416
                                                           NULL};
2417
2418
#if PTLS_OPENSSL_HAVE_BF
2419
ptls_cipher_algorithm_t ptls_openssl_bfecb = {"BF-ECB",        PTLS_BLOWFISH_KEY_SIZE,          PTLS_BLOWFISH_BLOCK_SIZE,
2420
                                              0 /* iv size */, sizeof(struct cipher_context_t), bfecb_setup_crypto};
2421
#endif
2422
2423
ptls_hpke_kem_t ptls_openssl_hpke_kem_p256sha256 = {PTLS_HPKE_KEM_P256_SHA256, &ptls_openssl_secp256r1, &ptls_openssl_sha256};
2424
ptls_hpke_kem_t ptls_openssl_hpke_kem_p384sha384 = {PTLS_HPKE_KEM_P384_SHA384, &ptls_openssl_secp384r1, &ptls_openssl_sha384};
2425
#if PTLS_OPENSSL_HAVE_X25519
2426
ptls_hpke_kem_t ptls_openssl_hpke_kem_x25519sha256 = {PTLS_HPKE_KEM_X25519_SHA256, &ptls_openssl_x25519, &ptls_openssl_sha256};
2427
#endif
2428
ptls_hpke_kem_t *ptls_openssl_hpke_kems[] = {&ptls_openssl_hpke_kem_p384sha384,
2429
#if PTLS_OPENSSL_HAVE_X25519
2430
                                             &ptls_openssl_hpke_kem_x25519sha256,
2431
#endif
2432
                                             &ptls_openssl_hpke_kem_p256sha256, NULL};
2433
2434
ptls_hpke_cipher_suite_t ptls_openssl_hpke_aes128gcmsha256 = {
2435
    .id = {.kdf = PTLS_HPKE_HKDF_SHA256, .aead = PTLS_HPKE_AEAD_AES_128_GCM},
2436
    .name = "HKDF-SHA256/AES-128-GCM",
2437
    .hash = &ptls_openssl_sha256,
2438
    .aead = &ptls_openssl_aes128gcm};
2439
ptls_hpke_cipher_suite_t ptls_openssl_hpke_aes128gcmsha512 = {
2440
    .id = {.kdf = PTLS_HPKE_HKDF_SHA512, .aead = PTLS_HPKE_AEAD_AES_128_GCM},
2441
    .name = "HKDF-SHA512/AES-128-GCM",
2442
    .hash = &ptls_openssl_sha512,
2443
    .aead = &ptls_openssl_aes128gcm};
2444
ptls_hpke_cipher_suite_t ptls_openssl_hpke_aes256gcmsha384 = {
2445
    .id = {.kdf = PTLS_HPKE_HKDF_SHA384, .aead = PTLS_HPKE_AEAD_AES_256_GCM},
2446
    .name = "HKDF-SHA384/AES-256-GCM",
2447
    .hash = &ptls_openssl_sha384,
2448
    .aead = &ptls_openssl_aes256gcm};
2449
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2450
ptls_hpke_cipher_suite_t ptls_openssl_hpke_chacha20poly1305sha256 = {
2451
    .id = {.kdf = PTLS_HPKE_HKDF_SHA256, .aead = PTLS_HPKE_AEAD_CHACHA20POLY1305},
2452
    .name = "HKDF-SHA256/ChaCha20Poly1305",
2453
    .hash = &ptls_openssl_sha256,
2454
    .aead = &ptls_openssl_chacha20poly1305};
2455
#endif
2456
ptls_hpke_cipher_suite_t *ptls_openssl_hpke_cipher_suites[] = {&ptls_openssl_hpke_aes128gcmsha256,
2457
                                                               &ptls_openssl_hpke_aes256gcmsha384,
2458
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2459
                                                               &ptls_openssl_hpke_chacha20poly1305sha256,
2460
#endif
2461
                                                               &ptls_openssl_hpke_aes128gcmsha512, /* likely only for tests */
2462
                                                               NULL};