Coverage Report

Created: 2025-07-18 06:41

/src/h2o/deps/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
#if defined(OPENSSL_IS_BORINGSSL) && PTLS_OPENSSL_HAVE_X25519MLKEM768
55
#include <openssl/mlkem.h>
56
#endif
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
0
{
209
0
    EC_KEY *key;
210
211
0
    if ((key = EC_KEY_new()) == NULL)
212
0
        return NULL;
213
0
    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
0
    return key;
219
0
}
220
221
static int ecdh_calc_secret(ptls_iovec_t *out, const EC_GROUP *group, EC_KEY *privkey, EC_POINT *peer_point)
222
0
{
223
0
    ptls_iovec_t secret;
224
0
    int ret;
225
226
0
    secret.len = (EC_GROUP_get_degree(group) + 7) / 8;
227
0
    if ((secret.base = malloc(secret.len)) == NULL) {
228
0
        ret = PTLS_ERROR_NO_MEMORY;
229
0
        goto Exit;
230
0
    }
231
0
    if (ECDH_compute_key(secret.base, secret.len, peer_point, privkey, NULL) <= 0) {
232
0
        ret = PTLS_ALERT_HANDSHAKE_FAILURE; /* ??? */
233
0
        goto Exit;
234
0
    }
235
0
    ret = 0;
236
237
0
Exit:
238
0
    if (ret == 0) {
239
0
        *out = secret;
240
0
    } else {
241
0
        free(secret.base);
242
0
        *out = (ptls_iovec_t){NULL};
243
0
    }
244
0
    return ret;
245
0
}
246
247
static EC_POINT *x9_62_decode_point(const EC_GROUP *group, ptls_iovec_t vec, BN_CTX *bn_ctx)
248
0
{
249
0
    EC_POINT *point = NULL;
250
251
0
    if ((point = EC_POINT_new(group)) == NULL)
252
0
        return NULL;
253
0
    if (!EC_POINT_oct2point(group, point, vec.base, vec.len, bn_ctx)) {
254
0
        EC_POINT_free(point);
255
0
        return NULL;
256
0
    }
257
258
0
    return point;
259
0
}
260
261
static ptls_iovec_t x9_62_encode_point(const EC_GROUP *group, const EC_POINT *point, BN_CTX *bn_ctx)
262
0
{
263
0
    ptls_iovec_t vec;
264
265
0
    if ((vec.len = EC_POINT_point2oct(group, point, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, bn_ctx)) == 0)
266
0
        return (ptls_iovec_t){NULL};
267
0
    if ((vec.base = malloc(vec.len)) == NULL)
268
0
        return (ptls_iovec_t){NULL};
269
0
    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
0
    return vec;
275
0
}
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
0
{
285
0
    free(ctx->super.pubkey.base);
286
0
    if (ctx->privkey != NULL)
287
0
        EC_KEY_free(ctx->privkey);
288
0
    if (ctx->bn_ctx != NULL)
289
0
        BN_CTX_free(ctx->bn_ctx);
290
0
    free(ctx);
291
0
}
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
0
{
295
0
    struct st_x9_62_keyex_context_t *ctx = (struct st_x9_62_keyex_context_t *)*_ctx;
296
0
    const EC_GROUP *group = EC_KEY_get0_group(ctx->privkey);
297
0
    EC_POINT *peer_point = NULL;
298
0
    int ret;
299
300
0
    if (secret == NULL) {
301
0
        ret = 0;
302
0
        goto Exit;
303
0
    }
304
305
0
    if ((peer_point = x9_62_decode_point(group, peerkey, ctx->bn_ctx)) == NULL) {
306
0
        ret = PTLS_ALERT_DECODE_ERROR;
307
0
        goto Exit;
308
0
    }
309
0
    if ((ret = ecdh_calc_secret(secret, group, ctx->privkey, peer_point)) != 0)
310
0
        goto Exit;
311
312
0
Exit:
313
0
    if (peer_point != NULL)
314
0
        EC_POINT_free(peer_point);
315
0
    if (release) {
316
0
        x9_62_free_context(ctx);
317
0
        *_ctx = NULL;
318
0
    }
319
0
    return ret;
320
0
}
321
322
static int x9_62_create_context(ptls_key_exchange_algorithm_t *algo, struct st_x9_62_keyex_context_t **ctx)
323
0
{
324
0
    int ret;
325
326
0
    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
0
    **ctx = (struct st_x9_62_keyex_context_t){{algo, {NULL}, x9_62_on_exchange}};
331
332
0
    if (((*ctx)->bn_ctx = BN_CTX_new()) == NULL) {
333
0
        ret = PTLS_ERROR_NO_MEMORY;
334
0
        goto Exit;
335
0
    }
336
337
0
    ret = 0;
338
0
Exit:
339
0
    if (ret != 0 && *ctx != NULL) {
340
0
        x9_62_free_context(*ctx);
341
0
        *ctx = NULL;
342
0
    }
343
0
    return ret;
344
0
}
345
346
static int x9_62_setup_pubkey(struct st_x9_62_keyex_context_t *ctx)
347
0
{
348
0
    const EC_GROUP *group = EC_KEY_get0_group(ctx->privkey);
349
0
    const EC_POINT *pubkey = EC_KEY_get0_public_key(ctx->privkey);
350
0
    if ((ctx->super.pubkey = x9_62_encode_point(group, pubkey, ctx->bn_ctx)).base == NULL)
351
0
        return PTLS_ERROR_NO_MEMORY;
352
0
    return 0;
353
0
}
354
355
static int x9_62_create_key_exchange(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **_ctx)
356
0
{
357
0
    EC_GROUP *group = NULL;
358
0
    struct st_x9_62_keyex_context_t *ctx = NULL;
359
0
    int ret;
360
361
    /* FIXME use a global? */
362
0
    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
0
    if ((ret = x9_62_create_context(algo, &ctx)) != 0)
367
0
        goto Exit;
368
0
    if ((ctx->privkey = ecdh_generate_key(group)) == NULL) {
369
0
        ret = PTLS_ERROR_LIBRARY;
370
0
        goto Exit;
371
0
    }
372
0
    if ((ret = x9_62_setup_pubkey(ctx)) != 0)
373
0
        goto Exit;
374
0
    ret = 0;
375
376
0
Exit:
377
0
    if (group != NULL)
378
0
        EC_GROUP_free(group);
379
0
    if (ret == 0) {
380
0
        *_ctx = &ctx->super;
381
0
    } else {
382
0
        if (ctx != NULL)
383
0
            x9_62_free_context(ctx);
384
0
        *_ctx = NULL;
385
0
    }
386
387
0
    return ret;
388
0
}
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 defined(OPENSSL_IS_BORINGSSL) && 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
#if PTLS_OPENSSL_HAVE_MLKEM
842
843
static int evp_kem_on_exchange(ptls_key_exchange_context_t **_ctx, int release, ptls_iovec_t *secret, ptls_iovec_t ciphertext)
844
{
845
    struct st_evp_keyex_context_t *ctx = (void *)*_ctx;
846
    EVP_PKEY_CTX *evpctx = NULL;
847
    int ret;
848
849
    if (secret == NULL) {
850
        ret = 0;
851
        goto Exit;
852
    }
853
854
    *secret = ptls_iovec_init(NULL, 0);
855
856
    if ((evpctx = EVP_PKEY_CTX_new_from_pkey(NULL, ctx->privkey, NULL)) == NULL) {
857
        ret = PTLS_ERROR_LIBRARY;
858
        goto Exit;
859
    }
860
    if (EVP_PKEY_decapsulate_init(evpctx, NULL) <= 0) {
861
        ret = PTLS_ERROR_LIBRARY;
862
        goto Exit;
863
    }
864
    if (EVP_PKEY_decapsulate(evpctx, NULL, &secret->len, ciphertext.base, ciphertext.len) <= 0) {
865
        ret = PTLS_ERROR_LIBRARY;
866
        goto Exit;
867
    }
868
    if ((secret->base = malloc(secret->len)) == NULL) {
869
        ret = PTLS_ERROR_NO_MEMORY;
870
        goto Exit;
871
    }
872
    if (EVP_PKEY_decapsulate(evpctx, secret->base, &secret->len, ciphertext.base, ciphertext.len) <= 0) {
873
        ret = PTLS_ERROR_LIBRARY;
874
        goto Exit;
875
    }
876
    ret = 0;
877
878
Exit:
879
    if (evpctx != NULL)
880
        EVP_PKEY_CTX_free(evpctx);
881
    if (ret != 0) {
882
        free(secret->base);
883
        *secret = ptls_iovec_init(NULL, 0);
884
    }
885
    if (release) {
886
        evp_keyex_free(ctx);
887
        *_ctx = NULL;
888
    }
889
    return ret;
890
}
891
892
static int evp_kem_create(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **_ctx)
893
{
894
    struct st_evp_keyex_context_t *ctx = NULL;
895
    EVP_PKEY_CTX *evpctx = NULL;
896
    int ret;
897
898
    /* instantiate */
899
    if ((ctx = malloc(sizeof(*ctx))) == NULL) {
900
        ret = PTLS_ERROR_NO_MEMORY;
901
        goto Exit;
902
    }
903
    *ctx = (struct st_evp_keyex_context_t){{algo, {NULL}, evp_kem_on_exchange}, NULL};
904
905
    /* generate private key */
906
    if ((evpctx = EVP_PKEY_CTX_new_from_name(NULL, (const char *)algo->data, NULL)) == NULL) {
907
        ret = PTLS_ERROR_LIBRARY;
908
        goto Exit;
909
    }
910
    if (EVP_PKEY_keygen_init(evpctx) <= 0) {
911
        ret = PTLS_ERROR_LIBRARY;
912
        goto Exit;
913
    }
914
    if (EVP_PKEY_generate(evpctx, &ctx->privkey) <= 0) {
915
        ret = PTLS_ERROR_LIBRARY;
916
        goto Exit;
917
    }
918
919
    /* set public key */
920
    if ((ctx->super.pubkey.len = EVP_PKEY_get1_encoded_public_key(ctx->privkey, &ctx->super.pubkey.base)) == 0) {
921
        ctx->super.pubkey.base = NULL;
922
        ret = PTLS_ERROR_NO_MEMORY;
923
        goto Exit;
924
    }
925
926
    *_ctx = &ctx->super;
927
    ret = 0;
928
929
Exit:
930
    if (ret != 0 && ctx != NULL)
931
        evp_keyex_free(ctx);
932
    if (evpctx != NULL)
933
        EVP_PKEY_CTX_free(evpctx);
934
    return ret;
935
}
936
937
static int evp_kem_exchange(ptls_key_exchange_algorithm_t *algo, ptls_iovec_t *ciphertext, ptls_iovec_t *secret,
938
                            ptls_iovec_t peerkey)
939
{
940
    EVP_PKEY_CTX *evpctx = NULL;
941
    EVP_PKEY *key = NULL;
942
    int ret;
943
944
    *ciphertext = ptls_iovec_init(NULL, 0);
945
    *secret = ptls_iovec_init(NULL, 0);
946
947
    if ((evpctx = EVP_PKEY_CTX_new_from_name(NULL, (const char *)algo->data, NULL)) == NULL) {
948
        ret = PTLS_ERROR_LIBRARY;
949
        goto Exit;
950
    }
951
    if (EVP_PKEY_paramgen_init(evpctx) <= 0) {
952
        ret = PTLS_ERROR_LIBRARY;
953
        goto Exit;
954
    }
955
    if (EVP_PKEY_paramgen(evpctx, &key) <= 0) {
956
        ret = PTLS_ERROR_LIBRARY;
957
        goto Exit;
958
    }
959
    if (EVP_PKEY_set1_encoded_public_key(key, peerkey.base, peerkey.len) <= 0) {
960
        ret = PTLS_ERROR_LIBRARY;
961
        goto Exit;
962
    }
963
964
    evpctx = EVP_PKEY_CTX_new_from_pkey(NULL, key, NULL);
965
    if (evpctx == NULL) {
966
        ret = PTLS_ERROR_LIBRARY;
967
        goto Exit;
968
    }
969
    if (EVP_PKEY_encapsulate_init(evpctx, NULL) <= 0) {
970
        ret = PTLS_ERROR_LIBRARY;
971
        goto Exit;
972
    }
973
    if (EVP_PKEY_encapsulate(evpctx, NULL, &ciphertext->len, NULL, &secret->len) <= 0) {
974
        ret = PTLS_ERROR_LIBRARY;
975
        goto Exit;
976
    }
977
    if ((ciphertext->base = malloc(ciphertext->len)) == NULL) {
978
        ret = PTLS_ERROR_NO_MEMORY;
979
        goto Exit;
980
    }
981
    if ((secret->base = malloc(secret->len)) == NULL) {
982
        ret = PTLS_ERROR_NO_MEMORY;
983
        goto Exit;
984
    }
985
    if (EVP_PKEY_encapsulate(evpctx, ciphertext->base, &ciphertext->len, secret->base, &secret->len) <= 0) {
986
        ret = PTLS_ERROR_LIBRARY;
987
        goto Exit;
988
    }
989
    ret = 0;
990
991
Exit:
992
    if (evpctx != NULL)
993
        EVP_PKEY_CTX_free(evpctx);
994
    if (key != NULL)
995
        EVP_PKEY_free(key);
996
    if (ret != 0) {
997
        free(secret->base);
998
        *secret = ptls_iovec_init(NULL, 0);
999
        free(ciphertext->base);
1000
        *ciphertext = ptls_iovec_init(NULL, 0);
1001
    }
1002
    return ret;
1003
}
1004
1005
#endif
1006
1007
int ptls_openssl_create_key_exchange(ptls_key_exchange_context_t **ctx, EVP_PKEY *pkey)
1008
0
{
1009
0
    int ret, id;
1010
1011
0
    switch (id = EVP_PKEY_id(pkey)) {
1012
1013
0
    case EVP_PKEY_EC: {
1014
        /* obtain eckey */
1015
0
        EC_KEY *eckey = EVP_PKEY_get1_EC_KEY(pkey);
1016
1017
        /* determine algo */
1018
0
        ptls_key_exchange_algorithm_t *algo;
1019
0
        switch (EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey))) {
1020
0
        case NID_X9_62_prime256v1:
1021
0
            algo = &ptls_openssl_secp256r1;
1022
0
            break;
1023
0
#if PTLS_OPENSSL_HAVE_SECP384R1
1024
0
        case NID_secp384r1:
1025
0
            algo = &ptls_openssl_secp384r1;
1026
0
            break;
1027
0
#endif
1028
0
#if PTLS_OPENSSL_HAVE_SECP521R1
1029
0
        case NID_secp521r1:
1030
0
            algo = &ptls_openssl_secp521r1;
1031
0
            break;
1032
0
#endif
1033
0
        default:
1034
0
            EC_KEY_free(eckey);
1035
0
            return PTLS_ERROR_INCOMPATIBLE_KEY;
1036
0
        }
1037
1038
        /* load key */
1039
0
        if ((ret = x9_62_init_key(algo, ctx, eckey)) != 0) {
1040
0
            EC_KEY_free(eckey);
1041
0
            return ret;
1042
0
        }
1043
1044
0
        return 0;
1045
0
    } break;
1046
1047
0
#if PTLS_OPENSSL_HAVE_X25519
1048
0
    case NID_X25519:
1049
0
        if ((ret = evp_keyex_init(&ptls_openssl_x25519, ctx, pkey)) != 0)
1050
0
            return ret;
1051
0
        EVP_PKEY_up_ref(pkey);
1052
0
        return 0;
1053
0
#endif
1054
1055
0
    default:
1056
0
        return PTLS_ERROR_INCOMPATIBLE_KEY;
1057
0
    }
1058
0
}
1059
1060
#if PTLS_OPENSSL_HAVE_ASYNC
1061
1062
struct async_sign_ctx {
1063
    ptls_async_job_t super;
1064
    const ptls_openssl_signature_scheme_t *scheme;
1065
    EVP_MD_CTX *ctx;
1066
    ASYNC_WAIT_CTX *waitctx;
1067
    ASYNC_JOB *job;
1068
    size_t siglen;
1069
    uint8_t sig[0]; // must be last, see `async_sign_ctx_new`
1070
};
1071
1072
static void async_sign_ctx_free(ptls_async_job_t *_self)
1073
0
{
1074
0
    struct async_sign_ctx *self = (void *)_self;
1075
1076
    /* Once the async operation is complete, the user might call `ptls_free` instead of `ptls_handshake`. In such case, to avoid
1077
     * desynchronization, let the backend read the result from the socket. The code below is a loop, but it is not going to block;
1078
     * it is the responsibility of the user to refrain from calling `ptls_free` until the asynchronous operation is complete. */
1079
0
    if (self->job != NULL) {
1080
0
        int ret;
1081
0
        while (ASYNC_start_job(&self->job, self->waitctx, &ret, NULL, NULL, 0) == ASYNC_PAUSE)
1082
0
            ;
1083
0
    }
1084
1085
0
    EVP_MD_CTX_destroy(self->ctx);
1086
0
    ASYNC_WAIT_CTX_free(self->waitctx);
1087
0
    free(self);
1088
0
}
1089
1090
int async_sign_ctx_get_fd(ptls_async_job_t *_self)
1091
0
{
1092
0
    struct async_sign_ctx *self = (void *)_self;
1093
0
    OSSL_ASYNC_FD fds[1];
1094
0
    size_t numfds;
1095
1096
0
    ASYNC_WAIT_CTX_get_all_fds(self->waitctx, NULL, &numfds);
1097
0
    assert(numfds == 1);
1098
0
    ASYNC_WAIT_CTX_get_all_fds(self->waitctx, fds, &numfds);
1099
0
    return (int)fds[0];
1100
0
}
1101
1102
static ptls_async_job_t *async_sign_ctx_new(const ptls_openssl_signature_scheme_t *scheme, EVP_MD_CTX *ctx, size_t siglen)
1103
0
{
1104
0
    struct async_sign_ctx *self;
1105
1106
0
    if ((self = malloc(offsetof(struct async_sign_ctx, sig) + siglen)) == NULL)
1107
0
        return NULL;
1108
1109
0
    self->super = (ptls_async_job_t){async_sign_ctx_free, async_sign_ctx_get_fd};
1110
0
    self->scheme = scheme;
1111
0
    self->ctx = ctx;
1112
0
    self->waitctx = ASYNC_WAIT_CTX_new();
1113
0
    self->job = NULL;
1114
0
    self->siglen = siglen;
1115
0
    memset(self->sig, 0, siglen);
1116
1117
0
    return &self->super;
1118
0
}
1119
1120
static int do_sign_async_job(void *_async)
1121
0
{
1122
0
    struct async_sign_ctx *async = *(struct async_sign_ctx **)_async;
1123
0
    return EVP_DigestSignFinal(async->ctx, async->sig, &async->siglen);
1124
0
}
1125
1126
static int do_sign_async(ptls_buffer_t *outbuf, ptls_async_job_t **_async)
1127
0
{
1128
0
    struct async_sign_ctx *async = (void *)*_async;
1129
0
    int ret;
1130
1131
0
    switch (ASYNC_start_job(&async->job, async->waitctx, &ret, do_sign_async_job, &async, sizeof(async))) {
1132
0
    case ASYNC_PAUSE:
1133
0
        return PTLS_ERROR_ASYNC_OPERATION; // async operation inflight; bail out without getting rid of async context
1134
0
    case ASYNC_ERR:
1135
0
        ret = PTLS_ERROR_LIBRARY;
1136
0
        break;
1137
0
    case ASYNC_NO_JOBS:
1138
0
        ret = PTLS_ERROR_LIBRARY;
1139
0
        break;
1140
0
    case ASYNC_FINISH:
1141
0
        async->job = NULL;
1142
0
        ptls_buffer_pushv(outbuf, async->sig, async->siglen);
1143
0
        ret = 0;
1144
0
        break;
1145
0
    default:
1146
0
        ret = PTLS_ERROR_LIBRARY;
1147
0
        break;
1148
0
    }
1149
1150
0
Exit:
1151
0
    async_sign_ctx_free(&async->super);
1152
0
    *_async = NULL;
1153
0
    return ret;
1154
0
}
1155
1156
#endif
1157
1158
static int do_sign(EVP_PKEY *key, const ptls_openssl_signature_scheme_t *scheme, ptls_buffer_t *outbuf, ptls_iovec_t input,
1159
                   ptls_async_job_t **async)
1160
0
{
1161
0
    EVP_MD_CTX *ctx = NULL;
1162
0
    const EVP_MD *md = scheme->scheme_md != NULL ? scheme->scheme_md() : NULL;
1163
0
    EVP_PKEY_CTX *pkey_ctx;
1164
0
    size_t siglen;
1165
0
    int ret;
1166
1167
0
    if ((ctx = EVP_MD_CTX_create()) == NULL) {
1168
0
        ret = PTLS_ERROR_NO_MEMORY;
1169
0
        goto Exit;
1170
0
    }
1171
1172
0
    if (EVP_DigestSignInit(ctx, &pkey_ctx, md, NULL, key) != 1) {
1173
0
        ret = PTLS_ERROR_LIBRARY;
1174
0
        goto Exit;
1175
0
    }
1176
1177
0
#if PTLS_OPENSSL_HAVE_ED25519
1178
0
    if (EVP_PKEY_id(key) == EVP_PKEY_ED25519) {
1179
        /* ED25519 requires the use of the all-at-once function that appeared in OpenSSL 1.1.1, hence different path */
1180
0
        if (EVP_DigestSign(ctx, NULL, &siglen, input.base, input.len) != 1) {
1181
0
            ret = PTLS_ERROR_LIBRARY;
1182
0
            goto Exit;
1183
0
        }
1184
0
        if ((ret = ptls_buffer_reserve(outbuf, siglen)) != 0)
1185
0
            goto Exit;
1186
0
        if (EVP_DigestSign(ctx, outbuf->base + outbuf->off, &siglen, input.base, input.len) != 1) {
1187
0
            ret = PTLS_ERROR_LIBRARY;
1188
0
            goto Exit;
1189
0
        }
1190
0
    } else
1191
0
#endif
1192
0
    {
1193
0
        if (EVP_PKEY_id(key) == EVP_PKEY_RSA) {
1194
0
            if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING) != 1) {
1195
0
                ret = PTLS_ERROR_LIBRARY;
1196
0
                goto Exit;
1197
0
            }
1198
0
            if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, -1) != 1) {
1199
0
                ret = PTLS_ERROR_LIBRARY;
1200
0
                goto Exit;
1201
0
            }
1202
0
            if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, md) != 1) {
1203
0
                ret = PTLS_ERROR_LIBRARY;
1204
0
                goto Exit;
1205
0
            }
1206
0
        }
1207
0
        if (EVP_DigestSignUpdate(ctx, input.base, input.len) != 1) {
1208
0
            ret = PTLS_ERROR_LIBRARY;
1209
0
            goto Exit;
1210
0
        }
1211
0
        if (EVP_DigestSignFinal(ctx, NULL, &siglen) != 1) {
1212
0
            ret = PTLS_ERROR_LIBRARY;
1213
0
            goto Exit;
1214
0
        }
1215
        /* If permitted by the caller (by providing a non-NULL `async` slot), use the asynchronous signing method and return
1216
         * immediately. */
1217
0
#if PTLS_OPENSSL_HAVE_ASYNC
1218
0
        if (async != NULL) {
1219
0
            if ((*async = async_sign_ctx_new(scheme, ctx, siglen)) == NULL) {
1220
0
                ret = PTLS_ERROR_NO_MEMORY;
1221
0
                goto Exit;
1222
0
            }
1223
0
            return do_sign_async(outbuf, async);
1224
0
        }
1225
0
#endif
1226
        /* Otherwise, generate signature synchronously. */
1227
0
        if ((ret = ptls_buffer_reserve(outbuf, siglen)) != 0)
1228
0
            goto Exit;
1229
0
        if (EVP_DigestSignFinal(ctx, outbuf->base + outbuf->off, &siglen) != 1) {
1230
0
            ret = PTLS_ERROR_LIBRARY;
1231
0
            goto Exit;
1232
0
        }
1233
0
    }
1234
1235
0
    outbuf->off += siglen;
1236
1237
0
    ret = 0;
1238
0
Exit:
1239
0
    if (ctx != NULL)
1240
0
        EVP_MD_CTX_destroy(ctx);
1241
0
    return ret;
1242
0
}
1243
1244
struct cipher_context_t {
1245
    ptls_cipher_context_t super;
1246
    EVP_CIPHER_CTX *evp;
1247
};
1248
1249
static void cipher_dispose(ptls_cipher_context_t *_ctx)
1250
0
{
1251
0
    struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
1252
0
    EVP_CIPHER_CTX_free(ctx->evp);
1253
0
}
1254
1255
static void cipher_do_init(ptls_cipher_context_t *_ctx, const void *iv)
1256
0
{
1257
0
    struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
1258
0
    int ret;
1259
0
    ret = EVP_EncryptInit_ex(ctx->evp, NULL, NULL, NULL, iv);
1260
0
    assert(ret);
1261
0
}
1262
1263
static int cipher_setup_crypto(ptls_cipher_context_t *_ctx, int is_enc, const void *key, const EVP_CIPHER *cipher,
1264
                               void (*do_transform)(ptls_cipher_context_t *, void *, const void *, size_t))
1265
0
{
1266
0
    struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
1267
1268
0
    ctx->super.do_dispose = cipher_dispose;
1269
0
    ctx->super.do_init = cipher_do_init;
1270
0
    ctx->super.do_transform = do_transform;
1271
1272
0
    if ((ctx->evp = EVP_CIPHER_CTX_new()) == NULL)
1273
0
        return PTLS_ERROR_NO_MEMORY;
1274
1275
0
    if (is_enc) {
1276
0
        if (!EVP_EncryptInit_ex(ctx->evp, cipher, NULL, key, NULL))
1277
0
            goto Error;
1278
0
    } else {
1279
0
        if (!EVP_DecryptInit_ex(ctx->evp, cipher, NULL, key, NULL))
1280
0
            goto Error;
1281
0
        EVP_CIPHER_CTX_set_padding(ctx->evp, 0); /* required to disable one block buffering in ECB mode */
1282
0
    }
1283
1284
0
    return 0;
1285
0
Error:
1286
0
    EVP_CIPHER_CTX_free(ctx->evp);
1287
0
    return PTLS_ERROR_LIBRARY;
1288
0
}
1289
1290
static void cipher_encrypt(ptls_cipher_context_t *_ctx, void *output, const void *input, size_t _len)
1291
0
{
1292
0
    struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
1293
0
    int len = (int)_len, ret = EVP_EncryptUpdate(ctx->evp, output, &len, input, len);
1294
0
    assert(ret);
1295
0
    assert(len == (int)_len);
1296
0
}
1297
1298
static void cipher_decrypt(ptls_cipher_context_t *_ctx, void *output, const void *input, size_t _len)
1299
0
{
1300
0
    struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
1301
0
    int len = (int)_len, ret = EVP_DecryptUpdate(ctx->evp, output, &len, input, len);
1302
0
    assert(ret);
1303
0
    assert(len == (int)_len);
1304
0
}
1305
1306
static int aes128ecb_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1307
0
{
1308
0
    return cipher_setup_crypto(ctx, is_enc, key, EVP_aes_128_ecb(), is_enc ? cipher_encrypt : cipher_decrypt);
1309
0
}
1310
1311
static int aes256ecb_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1312
0
{
1313
0
    return cipher_setup_crypto(ctx, is_enc, key, EVP_aes_256_ecb(), is_enc ? cipher_encrypt : cipher_decrypt);
1314
0
}
1315
1316
static int aes128ctr_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1317
0
{
1318
0
    return cipher_setup_crypto(ctx, 1, key, EVP_aes_128_ctr(), cipher_encrypt);
1319
0
}
1320
1321
static int aes256ctr_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1322
0
{
1323
0
    return cipher_setup_crypto(ctx, 1, key, EVP_aes_256_ctr(), cipher_encrypt);
1324
0
}
1325
1326
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
1327
#ifdef OPENSSL_IS_BORINGSSL
1328
1329
struct boringssl_chacha20_context_t {
1330
    ptls_cipher_context_t super;
1331
    uint8_t key[PTLS_CHACHA20_KEY_SIZE];
1332
    uint8_t iv[12];
1333
    struct {
1334
        uint32_t ctr;
1335
        uint8_t bytes[64];
1336
        size_t len;
1337
    } keystream;
1338
};
1339
1340
static void boringssl_chacha20_dispose(ptls_cipher_context_t *_ctx)
1341
{
1342
    struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
1343
1344
    ptls_clear_memory(ctx->key, sizeof(ctx->key));
1345
    ptls_clear_memory(ctx->iv, sizeof(ctx->iv));
1346
    ptls_clear_memory(ctx->keystream.bytes, sizeof(ctx->keystream.bytes));
1347
}
1348
1349
static void boringssl_chacha20_init(ptls_cipher_context_t *_ctx, const void *_iv)
1350
{
1351
    struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
1352
    const uint8_t *iv = _iv;
1353
1354
    memcpy(ctx->iv, iv + 4, sizeof(ctx->iv));
1355
    ctx->keystream.ctr = iv[0] | ((uint32_t)iv[1] << 8) | ((uint32_t)iv[2] << 16) | ((uint32_t)iv[3] << 24);
1356
    ctx->keystream.len = 0;
1357
}
1358
1359
static inline void boringssl_chacha20_transform_buffered(struct boringssl_chacha20_context_t *ctx, uint8_t **output,
1360
                                                         const uint8_t **input, size_t *len)
1361
{
1362
    size_t apply_len = *len < ctx->keystream.len ? *len : ctx->keystream.len;
1363
    const uint8_t *ks = ctx->keystream.bytes + sizeof(ctx->keystream.bytes) - ctx->keystream.len;
1364
    ctx->keystream.len -= apply_len;
1365
1366
    *len -= apply_len;
1367
    for (size_t i = 0; i < apply_len; ++i)
1368
        *(*output)++ = *(*input)++ ^ *ks++;
1369
}
1370
1371
static void boringssl_chacha20_transform(ptls_cipher_context_t *_ctx, void *_output, const void *_input, size_t len)
1372
{
1373
    struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
1374
    uint8_t *output = _output;
1375
    const uint8_t *input = _input;
1376
1377
    if (len == 0)
1378
        return;
1379
1380
    if (ctx->keystream.len != 0) {
1381
        boringssl_chacha20_transform_buffered(ctx, &output, &input, &len);
1382
        if (len == 0)
1383
            return;
1384
    }
1385
1386
    assert(ctx->keystream.len == 0);
1387
1388
    if (len >= sizeof(ctx->keystream.bytes)) {
1389
        size_t blocks = len / CHACHA20POLY1305_BLOCKSIZE;
1390
        CRYPTO_chacha_20(output, input, blocks * CHACHA20POLY1305_BLOCKSIZE, ctx->key, ctx->iv, ctx->keystream.ctr);
1391
        ctx->keystream.ctr += blocks;
1392
        output += blocks * CHACHA20POLY1305_BLOCKSIZE;
1393
        input += blocks * CHACHA20POLY1305_BLOCKSIZE;
1394
        len -= blocks * CHACHA20POLY1305_BLOCKSIZE;
1395
        if (len == 0)
1396
            return;
1397
    }
1398
1399
    memset(ctx->keystream.bytes, 0, CHACHA20POLY1305_BLOCKSIZE);
1400
    CRYPTO_chacha_20(ctx->keystream.bytes, ctx->keystream.bytes, CHACHA20POLY1305_BLOCKSIZE, ctx->key, ctx->iv,
1401
                     ctx->keystream.ctr++);
1402
    ctx->keystream.len = sizeof(ctx->keystream.bytes);
1403
1404
    boringssl_chacha20_transform_buffered(ctx, &output, &input, &len);
1405
    assert(len == 0);
1406
}
1407
1408
static int boringssl_chacha20_setup_crypto(ptls_cipher_context_t *_ctx, int is_enc, const void *key)
1409
{
1410
    struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
1411
1412
    ctx->super.do_dispose = boringssl_chacha20_dispose;
1413
    ctx->super.do_init = boringssl_chacha20_init;
1414
    ctx->super.do_transform = boringssl_chacha20_transform;
1415
    memcpy(ctx->key, key, sizeof(ctx->key));
1416
1417
    return 0;
1418
}
1419
1420
#else
1421
1422
static int chacha20_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1423
0
{
1424
0
    return cipher_setup_crypto(ctx, 1, key, EVP_chacha20(), cipher_encrypt);
1425
0
}
1426
1427
#endif
1428
#endif
1429
1430
#if PTLS_OPENSSL_HAVE_BF
1431
1432
static int bfecb_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
1433
0
{
1434
0
    return cipher_setup_crypto(ctx, is_enc, key, EVP_bf_ecb(), is_enc ? cipher_encrypt : cipher_decrypt);
1435
0
}
1436
1437
#endif
1438
1439
struct aead_crypto_context_t {
1440
    ptls_aead_context_t super;
1441
    EVP_CIPHER_CTX *evp_ctx;
1442
    uint8_t static_iv[PTLS_MAX_IV_SIZE];
1443
};
1444
1445
static void aead_dispose_crypto(ptls_aead_context_t *_ctx)
1446
0
{
1447
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1448
1449
0
    if (ctx->evp_ctx != NULL)
1450
0
        EVP_CIPHER_CTX_free(ctx->evp_ctx);
1451
0
}
1452
1453
static void aead_get_iv(ptls_aead_context_t *_ctx, void *iv)
1454
0
{
1455
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1456
1457
0
    memcpy(iv, ctx->static_iv, ctx->super.algo->iv_size);
1458
0
}
1459
1460
static void aead_set_iv(ptls_aead_context_t *_ctx, const void *iv)
1461
0
{
1462
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1463
1464
0
    memcpy(ctx->static_iv, iv, ctx->super.algo->iv_size);
1465
0
}
1466
1467
static void aead_do_encrypt_init(ptls_aead_context_t *_ctx, uint64_t seq, const void *aad, size_t aadlen)
1468
0
{
1469
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1470
0
    uint8_t iv[PTLS_MAX_IV_SIZE];
1471
0
    int ret;
1472
1473
0
    ptls_aead__build_iv(ctx->super.algo, iv, ctx->static_iv, seq);
1474
0
    ret = EVP_EncryptInit_ex(ctx->evp_ctx, NULL, NULL, NULL, iv);
1475
0
    assert(ret);
1476
1477
0
    if (aadlen != 0) {
1478
0
        int blocklen;
1479
0
        ret = EVP_EncryptUpdate(ctx->evp_ctx, NULL, &blocklen, aad, (int)aadlen);
1480
0
        assert(ret);
1481
0
    }
1482
0
}
1483
1484
static size_t aead_do_encrypt_update(ptls_aead_context_t *_ctx, void *output, const void *input, size_t inlen)
1485
0
{
1486
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1487
0
    int blocklen, ret;
1488
1489
0
    ret = EVP_EncryptUpdate(ctx->evp_ctx, output, &blocklen, input, (int)inlen);
1490
0
    assert(ret);
1491
1492
0
    return blocklen;
1493
0
}
1494
1495
static size_t aead_do_encrypt_final(ptls_aead_context_t *_ctx, void *_output)
1496
0
{
1497
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1498
0
    uint8_t *output = _output;
1499
0
    size_t off = 0, tag_size = ctx->super.algo->tag_size;
1500
0
    int blocklen, ret;
1501
1502
0
    ret = EVP_EncryptFinal_ex(ctx->evp_ctx, output + off, &blocklen);
1503
0
    assert(ret);
1504
0
    off += blocklen;
1505
0
    ret = EVP_CIPHER_CTX_ctrl(ctx->evp_ctx, EVP_CTRL_GCM_GET_TAG, (int)tag_size, output + off);
1506
0
    assert(ret);
1507
0
    off += tag_size;
1508
1509
0
    return off;
1510
0
}
1511
1512
static size_t aead_do_decrypt(ptls_aead_context_t *_ctx, void *_output, const void *input, size_t inlen, uint64_t seq,
1513
                              const void *aad, size_t aadlen)
1514
0
{
1515
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1516
0
    uint8_t *output = _output, iv[PTLS_MAX_IV_SIZE];
1517
0
    size_t off = 0, tag_size = ctx->super.algo->tag_size;
1518
0
    int blocklen, ret;
1519
1520
0
    if (inlen < tag_size)
1521
0
        return SIZE_MAX;
1522
1523
0
    ptls_aead__build_iv(ctx->super.algo, iv, ctx->static_iv, seq);
1524
0
    ret = EVP_DecryptInit_ex(ctx->evp_ctx, NULL, NULL, NULL, iv);
1525
0
    assert(ret);
1526
0
    if (aadlen != 0) {
1527
0
        ret = EVP_DecryptUpdate(ctx->evp_ctx, NULL, &blocklen, aad, (int)aadlen);
1528
0
        assert(ret);
1529
0
    }
1530
0
    ret = EVP_DecryptUpdate(ctx->evp_ctx, output + off, &blocklen, input, (int)(inlen - tag_size));
1531
0
    assert(ret);
1532
0
    off += blocklen;
1533
0
    if (!EVP_CIPHER_CTX_ctrl(ctx->evp_ctx, EVP_CTRL_GCM_SET_TAG, (int)tag_size, (void *)((uint8_t *)input + inlen - tag_size)))
1534
0
        return SIZE_MAX;
1535
0
    if (!EVP_DecryptFinal_ex(ctx->evp_ctx, output + off, &blocklen))
1536
0
        return SIZE_MAX;
1537
0
    off += blocklen;
1538
1539
0
    return off;
1540
0
}
1541
1542
static int aead_setup_crypto(ptls_aead_context_t *_ctx, int is_enc, const void *key, const void *iv, const EVP_CIPHER *cipher)
1543
0
{
1544
0
    struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
1545
0
    int ret;
1546
1547
0
    ctx->super.dispose_crypto = aead_dispose_crypto;
1548
0
    ctx->super.do_get_iv = aead_get_iv;
1549
0
    ctx->super.do_set_iv = aead_set_iv;
1550
0
    if (is_enc) {
1551
0
        ctx->super.do_encrypt_init = aead_do_encrypt_init;
1552
0
        ctx->super.do_encrypt_update = aead_do_encrypt_update;
1553
0
        ctx->super.do_encrypt_final = aead_do_encrypt_final;
1554
0
        ctx->super.do_encrypt = ptls_aead__do_encrypt;
1555
0
        ctx->super.do_encrypt_v = ptls_aead__do_encrypt_v;
1556
0
        ctx->super.do_decrypt = NULL;
1557
0
    } else {
1558
0
        ctx->super.do_encrypt_init = NULL;
1559
0
        ctx->super.do_encrypt_update = NULL;
1560
0
        ctx->super.do_encrypt_final = NULL;
1561
0
        ctx->super.do_encrypt = NULL;
1562
0
        ctx->super.do_encrypt_v = NULL;
1563
0
        ctx->super.do_decrypt = aead_do_decrypt;
1564
0
    }
1565
0
    ctx->evp_ctx = NULL;
1566
1567
0
    if ((ctx->evp_ctx = EVP_CIPHER_CTX_new()) == NULL) {
1568
0
        ret = PTLS_ERROR_NO_MEMORY;
1569
0
        goto Error;
1570
0
    }
1571
0
    if (is_enc) {
1572
0
        if (!EVP_EncryptInit_ex(ctx->evp_ctx, cipher, NULL, key, NULL)) {
1573
0
            ret = PTLS_ERROR_LIBRARY;
1574
0
            goto Error;
1575
0
        }
1576
0
    } else {
1577
0
        if (!EVP_DecryptInit_ex(ctx->evp_ctx, cipher, NULL, key, NULL)) {
1578
0
            ret = PTLS_ERROR_LIBRARY;
1579
0
            goto Error;
1580
0
        }
1581
0
    }
1582
0
    if (!EVP_CIPHER_CTX_ctrl(ctx->evp_ctx, EVP_CTRL_GCM_SET_IVLEN, (int)ctx->super.algo->iv_size, NULL)) {
1583
0
        ret = PTLS_ERROR_LIBRARY;
1584
0
        goto Error;
1585
0
    }
1586
1587
0
    memcpy(ctx->static_iv, iv, ctx->super.algo->iv_size);
1588
1589
0
    return 0;
1590
1591
0
Error:
1592
0
    aead_dispose_crypto(&ctx->super);
1593
0
    return ret;
1594
0
}
1595
1596
static int aead_aes128gcm_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
1597
0
{
1598
0
    return aead_setup_crypto(ctx, is_enc, key, iv, EVP_aes_128_gcm());
1599
0
}
1600
1601
static int aead_aes256gcm_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
1602
0
{
1603
0
    return aead_setup_crypto(ctx, is_enc, key, iv, EVP_aes_256_gcm());
1604
0
}
1605
1606
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
1607
#ifdef OPENSSL_IS_BORINGSSL
1608
1609
struct boringssl_chacha20poly1305_context_t {
1610
    struct chacha20poly1305_context_t super;
1611
    poly1305_state poly1305;
1612
};
1613
1614
static void boringssl_poly1305_init(struct chacha20poly1305_context_t *_ctx, const void *key)
1615
{
1616
    struct boringssl_chacha20poly1305_context_t *ctx = (struct boringssl_chacha20poly1305_context_t *)_ctx;
1617
    CRYPTO_poly1305_init(&ctx->poly1305, key);
1618
}
1619
1620
static void boringssl_poly1305_update(struct chacha20poly1305_context_t *_ctx, const void *input, size_t len)
1621
{
1622
    struct boringssl_chacha20poly1305_context_t *ctx = (struct boringssl_chacha20poly1305_context_t *)_ctx;
1623
    CRYPTO_poly1305_update(&ctx->poly1305, input, len);
1624
}
1625
1626
static void boringssl_poly1305_finish(struct chacha20poly1305_context_t *_ctx, void *tag)
1627
{
1628
    struct boringssl_chacha20poly1305_context_t *ctx = (struct boringssl_chacha20poly1305_context_t *)_ctx;
1629
    CRYPTO_poly1305_finish(&ctx->poly1305, tag);
1630
}
1631
1632
static int boringssl_chacha20poly1305_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
1633
{
1634
    return chacha20poly1305_setup_crypto(ctx, is_enc, key, iv, &ptls_openssl_chacha20, boringssl_poly1305_init,
1635
                                         boringssl_poly1305_update, boringssl_poly1305_finish);
1636
}
1637
1638
#else
1639
1640
static int aead_chacha20poly1305_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
1641
0
{
1642
0
    return aead_setup_crypto(ctx, is_enc, key, iv, EVP_chacha20_poly1305());
1643
0
}
1644
1645
#endif
1646
#endif
1647
1648
0
#define _sha256_final(ctx, md) SHA256_Final((md), (ctx))
1649
0
ptls_define_hash(sha256, SHA256_CTX, SHA256_Init, SHA256_Update, _sha256_final);
1650
1651
0
#define _sha384_final(ctx, md) SHA384_Final((md), (ctx))
1652
0
ptls_define_hash(sha384, SHA512_CTX, SHA384_Init, SHA384_Update, _sha384_final);
1653
1654
0
#define _sha512_final(ctx, md) SHA512_Final((md), (ctx))
1655
0
ptls_define_hash(sha512, SHA512_CTX, SHA512_Init, SHA512_Update, _sha512_final);
1656
1657
static int sign_certificate(ptls_sign_certificate_t *_self, ptls_t *tls, ptls_async_job_t **async, uint16_t *selected_algorithm,
1658
                            ptls_buffer_t *outbuf, ptls_iovec_t input, const uint16_t *algorithms, size_t num_algorithms)
1659
0
{
1660
0
    ptls_openssl_sign_certificate_t *self = (ptls_openssl_sign_certificate_t *)_self;
1661
0
    const ptls_openssl_signature_scheme_t *scheme;
1662
1663
    /* Just resume the asynchronous operation, if one is in flight. */
1664
0
#if PTLS_OPENSSL_HAVE_ASYNC
1665
0
    if (async != NULL && *async != NULL) {
1666
0
        struct async_sign_ctx *sign_ctx = (struct async_sign_ctx *)(*async);
1667
0
        *selected_algorithm = sign_ctx->scheme->scheme_id;
1668
0
        return do_sign_async(outbuf, async);
1669
0
    }
1670
0
#endif
1671
1672
    /* Select the algorithm or return failure if none found. */
1673
0
    if ((scheme = ptls_openssl_select_signature_scheme(self->schemes, algorithms, num_algorithms)) == NULL)
1674
0
        return PTLS_ALERT_HANDSHAKE_FAILURE;
1675
0
    *selected_algorithm = scheme->scheme_id;
1676
1677
0
#if PTLS_OPENSSL_HAVE_ASYNC
1678
0
    if (!self->async && async != NULL) {
1679
        /* indicate to `do_sign` that async mode is disabled for this operation */
1680
0
        assert(*async == NULL);
1681
0
        async = NULL;
1682
0
    }
1683
0
#endif
1684
0
    return do_sign(self->key, scheme, outbuf, input, async);
1685
0
}
1686
1687
static X509 *to_x509(ptls_iovec_t vec)
1688
0
{
1689
0
    const uint8_t *p = vec.base;
1690
0
    return d2i_X509(NULL, &p, (long)vec.len);
1691
0
}
1692
1693
static int verify_sign(void *verify_ctx, uint16_t algo, ptls_iovec_t data, ptls_iovec_t signature)
1694
0
{
1695
0
    EVP_PKEY *key = verify_ctx;
1696
0
    const ptls_openssl_signature_scheme_t *scheme;
1697
0
    EVP_MD_CTX *ctx = NULL;
1698
0
    EVP_PKEY_CTX *pkey_ctx = NULL;
1699
0
    int ret = 0;
1700
1701
0
    if (data.base == NULL)
1702
0
        goto Exit;
1703
1704
0
    if ((scheme = ptls_openssl_lookup_signature_schemes(key)) == NULL) {
1705
0
        ret = PTLS_ERROR_LIBRARY;
1706
0
        goto Exit;
1707
0
    }
1708
0
    for (; scheme->scheme_id != UINT16_MAX; ++scheme)
1709
0
        if (scheme->scheme_id == algo)
1710
0
            goto SchemeFound;
1711
0
    ret = PTLS_ALERT_ILLEGAL_PARAMETER;
1712
0
    goto Exit;
1713
1714
0
SchemeFound:
1715
0
    if ((ctx = EVP_MD_CTX_create()) == NULL) {
1716
0
        ret = PTLS_ERROR_NO_MEMORY;
1717
0
        goto Exit;
1718
0
    }
1719
1720
0
#if PTLS_OPENSSL_HAVE_ED25519
1721
0
    if (EVP_PKEY_id(key) == EVP_PKEY_ED25519) {
1722
        /* ED25519 requires the use of the all-at-once function that appeared in OpenSSL 1.1.1, hence different path */
1723
0
        if (EVP_DigestVerifyInit(ctx, &pkey_ctx, NULL, NULL, key) != 1) {
1724
0
            ret = PTLS_ERROR_LIBRARY;
1725
0
            goto Exit;
1726
0
        }
1727
0
        if (EVP_DigestVerify(ctx, signature.base, signature.len, data.base, data.len) != 1) {
1728
0
            ret = PTLS_ERROR_LIBRARY;
1729
0
            goto Exit;
1730
0
        }
1731
0
    } else
1732
0
#endif
1733
0
    {
1734
0
        if (EVP_DigestVerifyInit(ctx, &pkey_ctx, scheme->scheme_md(), NULL, key) != 1) {
1735
0
            ret = PTLS_ERROR_LIBRARY;
1736
0
            goto Exit;
1737
0
        }
1738
1739
0
        if (EVP_PKEY_id(key) == EVP_PKEY_RSA) {
1740
0
            if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING) != 1) {
1741
0
                ret = PTLS_ERROR_LIBRARY;
1742
0
                goto Exit;
1743
0
            }
1744
0
            if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, -1) != 1) {
1745
0
                ret = PTLS_ERROR_LIBRARY;
1746
0
                goto Exit;
1747
0
            }
1748
0
            if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, scheme->scheme_md()) != 1) {
1749
0
                ret = PTLS_ERROR_LIBRARY;
1750
0
                goto Exit;
1751
0
            }
1752
0
        }
1753
0
        if (EVP_DigestVerifyUpdate(ctx, data.base, data.len) != 1) {
1754
0
            ret = PTLS_ERROR_LIBRARY;
1755
0
            goto Exit;
1756
0
        }
1757
0
        if (EVP_DigestVerifyFinal(ctx, signature.base, signature.len) != 1) {
1758
0
            ret = PTLS_ALERT_DECRYPT_ERROR;
1759
0
            goto Exit;
1760
0
        }
1761
0
    }
1762
1763
0
    ret = 0;
1764
1765
0
Exit:
1766
0
    if (ctx != NULL)
1767
0
        EVP_MD_CTX_destroy(ctx);
1768
0
    EVP_PKEY_free(key);
1769
0
    return ret;
1770
0
}
1771
1772
int ptls_openssl_init_sign_certificate(ptls_openssl_sign_certificate_t *self, EVP_PKEY *key)
1773
0
{
1774
0
    *self = (ptls_openssl_sign_certificate_t){.super = {sign_certificate}, .async = 0 /* libssl has it off by default too */};
1775
1776
0
    if ((self->schemes = ptls_openssl_lookup_signature_schemes(key)) == NULL)
1777
0
        return PTLS_ERROR_INCOMPATIBLE_KEY;
1778
0
    EVP_PKEY_up_ref(key);
1779
0
    self->key = key;
1780
1781
0
    return 0;
1782
0
}
1783
1784
void ptls_openssl_dispose_sign_certificate(ptls_openssl_sign_certificate_t *self)
1785
0
{
1786
0
    EVP_PKEY_free(self->key);
1787
0
}
1788
1789
static int serialize_cert(X509 *cert, ptls_iovec_t *dst)
1790
0
{
1791
0
    int len = i2d_X509(cert, NULL);
1792
0
    assert(len > 0);
1793
1794
0
    if ((dst->base = malloc(len)) == NULL)
1795
0
        return PTLS_ERROR_NO_MEMORY;
1796
0
    unsigned char *p = dst->base;
1797
0
    dst->len = i2d_X509(cert, &p);
1798
0
    assert(len == dst->len);
1799
1800
0
    return 0;
1801
0
}
1802
1803
int ptls_openssl_load_certificates(ptls_context_t *ctx, X509 *cert, STACK_OF(X509) * chain)
1804
0
{
1805
0
    ptls_iovec_t *list = NULL;
1806
0
    size_t slot = 0, count = (cert != NULL) + (chain != NULL ? sk_X509_num(chain) : 0);
1807
0
    int ret;
1808
1809
0
    assert(ctx->certificates.list == NULL);
1810
1811
0
    if ((list = malloc(sizeof(*list) * count)) == NULL) {
1812
0
        ret = PTLS_ERROR_NO_MEMORY;
1813
0
        goto Exit;
1814
0
    }
1815
0
    if (cert != NULL) {
1816
0
        if ((ret = serialize_cert(cert, list + slot++)) != 0)
1817
0
            goto Exit;
1818
0
    }
1819
0
    if (chain != NULL) {
1820
0
        int i;
1821
0
        for (i = 0; i != sk_X509_num(chain); ++i) {
1822
0
            if ((ret = serialize_cert(sk_X509_value(chain, i), list + slot++)) != 0)
1823
0
                goto Exit;
1824
0
        }
1825
0
    }
1826
1827
0
    assert(slot == count);
1828
1829
0
    ctx->certificates.list = list;
1830
0
    ctx->certificates.count = count;
1831
0
    ret = 0;
1832
1833
0
Exit:
1834
0
    if (ret != 0 && list != NULL) {
1835
0
        size_t i;
1836
0
        for (i = 0; i != slot; ++i)
1837
0
            free(list[i].base);
1838
0
        free(list);
1839
0
    }
1840
0
    return ret;
1841
0
}
1842
1843
static int verify_cert_chain(X509_STORE *store, X509 *cert, STACK_OF(X509) * chain, int is_server, const char *server_name,
1844
                             int *ossl_x509_err)
1845
0
{
1846
0
    X509_STORE_CTX *verify_ctx;
1847
0
    int ret;
1848
0
    *ossl_x509_err = 0;
1849
1850
    /* verify certificate chain */
1851
0
    if ((verify_ctx = X509_STORE_CTX_new()) == NULL) {
1852
0
        ret = PTLS_ERROR_NO_MEMORY;
1853
0
        goto Exit;
1854
0
    }
1855
0
    if (X509_STORE_CTX_init(verify_ctx, store, cert, chain) != 1) {
1856
0
        ret = PTLS_ERROR_LIBRARY;
1857
0
        goto Exit;
1858
0
    }
1859
1860
0
    { /* setup verify params */
1861
0
        X509_VERIFY_PARAM *params = X509_STORE_CTX_get0_param(verify_ctx);
1862
0
        X509_VERIFY_PARAM_set_purpose(params, is_server ? X509_PURPOSE_SSL_CLIENT : X509_PURPOSE_SSL_SERVER);
1863
0
        X509_VERIFY_PARAM_set_depth(params, 98); /* use the default of OpenSSL 1.0.2 and above; see `man SSL_CTX_set_verify` */
1864
        /* when _acting_ as client, set the server name if provided*/
1865
0
        if (!is_server && server_name != NULL) {
1866
0
            if (ptls_server_name_is_ipaddr(server_name)) {
1867
0
                X509_VERIFY_PARAM_set1_ip_asc(params, server_name);
1868
0
            } else {
1869
0
                X509_VERIFY_PARAM_set1_host(params, server_name, strlen(server_name));
1870
0
                X509_VERIFY_PARAM_set_hostflags(params, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
1871
0
            }
1872
0
        }
1873
0
    }
1874
1875
0
    if (X509_verify_cert(verify_ctx) != 1) {
1876
0
        *ossl_x509_err = X509_STORE_CTX_get_error(verify_ctx);
1877
0
        switch (*ossl_x509_err) {
1878
0
        case X509_V_ERR_OUT_OF_MEM:
1879
0
            ret = PTLS_ERROR_NO_MEMORY;
1880
0
            break;
1881
0
        case X509_V_ERR_CERT_REVOKED:
1882
0
            ret = PTLS_ALERT_CERTIFICATE_REVOKED;
1883
0
            break;
1884
0
        case X509_V_ERR_CERT_NOT_YET_VALID:
1885
0
        case X509_V_ERR_CERT_HAS_EXPIRED:
1886
0
            ret = PTLS_ALERT_CERTIFICATE_EXPIRED;
1887
0
            break;
1888
0
        case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
1889
0
        case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
1890
0
        case X509_V_ERR_CERT_UNTRUSTED:
1891
0
        case X509_V_ERR_CERT_REJECTED:
1892
0
            ret = PTLS_ALERT_UNKNOWN_CA;
1893
0
            break;
1894
0
        case X509_V_ERR_HOSTNAME_MISMATCH:
1895
0
        case X509_V_ERR_INVALID_CA:
1896
0
            ret = PTLS_ALERT_BAD_CERTIFICATE;
1897
0
            break;
1898
0
        default:
1899
0
            ret = PTLS_ALERT_CERTIFICATE_UNKNOWN;
1900
0
            break;
1901
0
        }
1902
0
        goto Exit;
1903
0
    }
1904
1905
0
    ret = 0;
1906
1907
0
Exit:
1908
0
    if (verify_ctx != NULL)
1909
0
        X509_STORE_CTX_free(verify_ctx);
1910
0
    return ret;
1911
0
}
1912
1913
static int verify_cert(ptls_verify_certificate_t *_self, ptls_t *tls, const char *server_name,
1914
                       int (**verifier)(void *, uint16_t, ptls_iovec_t, ptls_iovec_t), void **verify_data, ptls_iovec_t *certs,
1915
                       size_t num_certs)
1916
0
{
1917
0
    ptls_openssl_verify_certificate_t *self = (ptls_openssl_verify_certificate_t *)_self;
1918
0
    X509 *cert = NULL;
1919
0
    STACK_OF(X509) *chain = sk_X509_new_null();
1920
0
    size_t i;
1921
0
    int ossl_x509_err, ret;
1922
1923
    /* If any certs are given, convert them to OpenSSL representation, then verify the cert chain. If no certs are given, just give
1924
     * the override_callback to see if we want to stay fail open. */
1925
0
    if (num_certs != 0) {
1926
0
        if ((cert = to_x509(certs[0])) == NULL) {
1927
0
            ret = PTLS_ALERT_BAD_CERTIFICATE;
1928
0
            goto Exit;
1929
0
        }
1930
0
        for (i = 1; i != num_certs; ++i) {
1931
0
            X509 *interm = to_x509(certs[i]);
1932
0
            if (interm == NULL) {
1933
0
                ret = PTLS_ALERT_BAD_CERTIFICATE;
1934
0
                goto Exit;
1935
0
            }
1936
0
            sk_X509_push(chain, interm);
1937
0
        }
1938
0
        ret = verify_cert_chain(self->cert_store, cert, chain, ptls_is_server(tls), server_name, &ossl_x509_err);
1939
0
    } else {
1940
0
        ret = PTLS_ALERT_CERTIFICATE_REQUIRED;
1941
0
        ossl_x509_err = 0;
1942
0
    }
1943
1944
    /* When override callback is available, let it override the error. */
1945
0
    if (self->override_callback != NULL)
1946
0
        ret = self->override_callback->cb(self->override_callback, tls, ret, ossl_x509_err, cert, chain);
1947
1948
0
    if (ret != 0 || num_certs == 0)
1949
0
        goto Exit;
1950
1951
    /* extract public key for verifying the TLS handshake signature */
1952
0
    if ((*verify_data = X509_get_pubkey(cert)) == NULL) {
1953
0
        ret = PTLS_ALERT_BAD_CERTIFICATE;
1954
0
        goto Exit;
1955
0
    }
1956
0
    *verifier = verify_sign;
1957
1958
0
Exit:
1959
0
    if (chain != NULL)
1960
0
        sk_X509_pop_free(chain, X509_free);
1961
0
    if (cert != NULL)
1962
0
        X509_free(cert);
1963
0
    return ret;
1964
0
}
1965
1966
int ptls_openssl_init_verify_certificate(ptls_openssl_verify_certificate_t *self, X509_STORE *store)
1967
0
{
1968
0
    *self = (ptls_openssl_verify_certificate_t){{verify_cert, default_signature_schemes}, NULL};
1969
1970
0
    if (store != NULL) {
1971
0
        X509_STORE_up_ref(store);
1972
0
        self->cert_store = store;
1973
0
    } else {
1974
        /* use default store */
1975
0
        if ((self->cert_store = ptls_openssl_create_default_certificate_store()) == NULL)
1976
0
            return -1;
1977
0
    }
1978
1979
0
    return 0;
1980
0
}
1981
1982
void ptls_openssl_dispose_verify_certificate(ptls_openssl_verify_certificate_t *self)
1983
0
{
1984
0
    X509_STORE_free(self->cert_store);
1985
0
}
1986
1987
X509_STORE *ptls_openssl_create_default_certificate_store(void)
1988
0
{
1989
0
    X509_STORE *store;
1990
0
    X509_LOOKUP *lookup;
1991
1992
0
    if ((store = X509_STORE_new()) == NULL)
1993
0
        goto Error;
1994
0
    if ((lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file())) == NULL)
1995
0
        goto Error;
1996
0
    X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT);
1997
0
    if ((lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir())) == NULL)
1998
0
        goto Error;
1999
0
    X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
2000
2001
0
    return store;
2002
0
Error:
2003
0
    if (store != NULL)
2004
0
        X509_STORE_free(store);
2005
0
    return NULL;
2006
0
}
2007
2008
static int verify_raw_cert(ptls_verify_certificate_t *_self, ptls_t *tls, const char *server_name,
2009
                           int (**verifier)(void *, uint16_t algo, ptls_iovec_t, ptls_iovec_t), void **verify_data,
2010
                           ptls_iovec_t *certs, size_t num_certs)
2011
0
{
2012
0
    ptls_openssl_raw_pubkey_verify_certificate_t *self = (ptls_openssl_raw_pubkey_verify_certificate_t *)_self;
2013
0
    int ret = PTLS_ALERT_BAD_CERTIFICATE;
2014
0
    ptls_iovec_t expected_pubkey = {0};
2015
2016
0
    assert(num_certs != 0);
2017
2018
0
    if (num_certs != 1)
2019
0
        goto Exit;
2020
2021
0
    int r = i2d_PUBKEY(self->expected_pubkey, &expected_pubkey.base);
2022
0
    if (r <= 0) {
2023
0
        ret = PTLS_ALERT_BAD_CERTIFICATE;
2024
0
        goto Exit;
2025
0
    }
2026
2027
0
    expected_pubkey.len = r;
2028
0
    if (certs[0].len != expected_pubkey.len)
2029
0
        goto Exit;
2030
2031
0
    if (!ptls_mem_equal(expected_pubkey.base, certs[0].base, certs[0].len))
2032
0
        goto Exit;
2033
2034
0
    EVP_PKEY_up_ref(self->expected_pubkey);
2035
0
    *verify_data = self->expected_pubkey;
2036
0
    *verifier = verify_sign;
2037
0
    ret = 0;
2038
0
Exit:
2039
0
    OPENSSL_free(expected_pubkey.base);
2040
0
    return ret;
2041
0
}
2042
2043
int ptls_openssl_raw_pubkey_init_verify_certificate(ptls_openssl_raw_pubkey_verify_certificate_t *self, EVP_PKEY *expected_pubkey)
2044
0
{
2045
0
    EVP_PKEY_up_ref(expected_pubkey);
2046
0
    *self = (ptls_openssl_raw_pubkey_verify_certificate_t){{verify_raw_cert, default_signature_schemes}, expected_pubkey};
2047
0
    return 0;
2048
0
}
2049
void ptls_openssl_raw_pubkey_dispose_verify_certificate(ptls_openssl_raw_pubkey_verify_certificate_t *self)
2050
0
{
2051
0
    EVP_PKEY_free(self->expected_pubkey);
2052
0
}
2053
2054
0
#define TICKET_LABEL_SIZE 16
2055
0
#define TICKET_IV_SIZE EVP_MAX_IV_LENGTH
2056
2057
int ptls_openssl_encrypt_ticket(ptls_buffer_t *buf, ptls_iovec_t src,
2058
                                int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc))
2059
0
{
2060
0
    EVP_CIPHER_CTX *cctx = NULL;
2061
0
    HMAC_CTX *hctx = NULL;
2062
0
    uint8_t *dst;
2063
0
    int clen, ret;
2064
2065
0
    if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
2066
0
        ret = PTLS_ERROR_NO_MEMORY;
2067
0
        goto Exit;
2068
0
    }
2069
0
    if ((hctx = HMAC_CTX_new()) == NULL) {
2070
0
        ret = PTLS_ERROR_NO_MEMORY;
2071
0
        goto Exit;
2072
0
    }
2073
2074
0
    if ((ret = ptls_buffer_reserve(buf, TICKET_LABEL_SIZE + TICKET_IV_SIZE + src.len + EVP_MAX_BLOCK_LENGTH + EVP_MAX_MD_SIZE)) !=
2075
0
        0)
2076
0
        goto Exit;
2077
0
    dst = buf->base + buf->off;
2078
2079
    /* fill label and iv, as well as obtaining the keys */
2080
0
    if (!(*cb)(dst, dst + TICKET_LABEL_SIZE, cctx, hctx, 1)) {
2081
0
        ret = PTLS_ERROR_LIBRARY;
2082
0
        goto Exit;
2083
0
    }
2084
0
    dst += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
2085
2086
    /* encrypt */
2087
0
    if (!EVP_EncryptUpdate(cctx, dst, &clen, src.base, (int)src.len)) {
2088
0
        ret = PTLS_ERROR_LIBRARY;
2089
0
        goto Exit;
2090
0
    }
2091
0
    dst += clen;
2092
0
    if (!EVP_EncryptFinal_ex(cctx, dst, &clen)) {
2093
0
        ret = PTLS_ERROR_LIBRARY;
2094
0
        goto Exit;
2095
0
    }
2096
0
    dst += clen;
2097
2098
    /* append hmac */
2099
0
    if (!HMAC_Update(hctx, buf->base + buf->off, dst - (buf->base + buf->off)) || !HMAC_Final(hctx, dst, NULL)) {
2100
0
        ret = PTLS_ERROR_LIBRARY;
2101
0
        goto Exit;
2102
0
    }
2103
0
    dst += HMAC_size(hctx);
2104
2105
0
    assert(dst <= buf->base + buf->capacity);
2106
0
    buf->off += dst - (buf->base + buf->off);
2107
0
    ret = 0;
2108
2109
0
Exit:
2110
0
    if (cctx != NULL)
2111
0
        EVP_CIPHER_CTX_free(cctx);
2112
0
    if (hctx != NULL)
2113
0
        HMAC_CTX_free(hctx);
2114
0
    return ret;
2115
0
}
2116
2117
int ptls_openssl_decrypt_ticket(ptls_buffer_t *buf, ptls_iovec_t src,
2118
                                int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc))
2119
0
{
2120
0
    EVP_CIPHER_CTX *cctx = NULL;
2121
0
    HMAC_CTX *hctx = NULL;
2122
0
    int clen, ret;
2123
2124
0
    if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
2125
0
        ret = PTLS_ERROR_NO_MEMORY;
2126
0
        goto Exit;
2127
0
    }
2128
0
    if ((hctx = HMAC_CTX_new()) == NULL) {
2129
0
        ret = PTLS_ERROR_NO_MEMORY;
2130
0
        goto Exit;
2131
0
    }
2132
2133
    /* obtain cipher and hash context.
2134
     * Note: no need to handle renew, since in picotls we always send a new ticket to minimize the chance of ticket reuse */
2135
0
    if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE) {
2136
0
        ret = PTLS_ALERT_DECODE_ERROR;
2137
0
        goto Exit;
2138
0
    }
2139
0
    if (!(*cb)(src.base, src.base + TICKET_LABEL_SIZE, cctx, hctx, 0)) {
2140
0
        ret = PTLS_ERROR_LIBRARY;
2141
0
        goto Exit;
2142
0
    }
2143
2144
    /* check hmac, and exclude label, iv, hmac */
2145
0
    size_t hmac_size = HMAC_size(hctx);
2146
0
    if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE + hmac_size) {
2147
0
        ret = PTLS_ALERT_DECODE_ERROR;
2148
0
        goto Exit;
2149
0
    }
2150
0
    src.len -= hmac_size;
2151
0
    uint8_t hmac[EVP_MAX_MD_SIZE];
2152
0
    if (!HMAC_Update(hctx, src.base, src.len) || !HMAC_Final(hctx, hmac, NULL)) {
2153
0
        ret = PTLS_ERROR_LIBRARY;
2154
0
        goto Exit;
2155
0
    }
2156
0
    if (!ptls_mem_equal(src.base + src.len, hmac, hmac_size)) {
2157
0
        ret = PTLS_ALERT_HANDSHAKE_FAILURE;
2158
0
        goto Exit;
2159
0
    }
2160
0
    src.base += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
2161
0
    src.len -= TICKET_LABEL_SIZE + TICKET_IV_SIZE;
2162
2163
    /* decrypt */
2164
0
    if ((ret = ptls_buffer_reserve(buf, src.len)) != 0)
2165
0
        goto Exit;
2166
0
    if (!EVP_DecryptUpdate(cctx, buf->base + buf->off, &clen, src.base, (int)src.len)) {
2167
0
        ret = PTLS_ERROR_LIBRARY;
2168
0
        goto Exit;
2169
0
    }
2170
0
    buf->off += clen;
2171
0
    if (!EVP_DecryptFinal_ex(cctx, buf->base + buf->off, &clen)) {
2172
0
        ret = PTLS_ERROR_LIBRARY;
2173
0
        goto Exit;
2174
0
    }
2175
0
    buf->off += clen;
2176
2177
0
    ret = 0;
2178
2179
0
Exit:
2180
0
    if (cctx != NULL)
2181
0
        EVP_CIPHER_CTX_free(cctx);
2182
0
    if (hctx != NULL)
2183
0
        HMAC_CTX_free(hctx);
2184
0
    return ret;
2185
0
}
2186
2187
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2188
int ptls_openssl_encrypt_ticket_evp(ptls_buffer_t *buf, ptls_iovec_t src,
2189
                                    int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, EVP_MAC_CTX *hctx,
2190
                                              int enc))
2191
{
2192
    EVP_CIPHER_CTX *cctx = NULL;
2193
    EVP_MAC *mac = NULL;
2194
    EVP_MAC_CTX *hctx = NULL;
2195
    size_t hlen;
2196
    uint8_t *dst;
2197
    int clen, ret;
2198
2199
    if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
2200
        ret = PTLS_ERROR_NO_MEMORY;
2201
        goto Exit;
2202
    }
2203
    if ((mac = EVP_MAC_fetch(NULL, "HMAC", NULL)) == NULL) {
2204
        ret = PTLS_ERROR_NO_MEMORY;
2205
        goto Exit;
2206
    }
2207
    if ((hctx = EVP_MAC_CTX_new(mac)) == NULL) {
2208
        ret = PTLS_ERROR_NO_MEMORY;
2209
        goto Exit;
2210
    }
2211
2212
    if ((ret = ptls_buffer_reserve(buf, TICKET_LABEL_SIZE + TICKET_IV_SIZE + src.len + EVP_MAX_BLOCK_LENGTH + EVP_MAX_MD_SIZE)) !=
2213
        0)
2214
        goto Exit;
2215
    dst = buf->base + buf->off;
2216
2217
    /* fill label and iv, as well as obtaining the keys */
2218
    if (!(*cb)(dst, dst + TICKET_LABEL_SIZE, cctx, hctx, 1)) {
2219
        ret = PTLS_ERROR_LIBRARY;
2220
        goto Exit;
2221
    }
2222
    dst += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
2223
2224
    /* encrypt */
2225
    if (!EVP_EncryptUpdate(cctx, dst, &clen, src.base, (int)src.len)) {
2226
        ret = PTLS_ERROR_LIBRARY;
2227
        goto Exit;
2228
    }
2229
    dst += clen;
2230
    if (!EVP_EncryptFinal_ex(cctx, dst, &clen)) {
2231
        ret = PTLS_ERROR_LIBRARY;
2232
        goto Exit;
2233
    }
2234
    dst += clen;
2235
2236
    /* append hmac */
2237
    if (!EVP_MAC_update(hctx, buf->base + buf->off, dst - (buf->base + buf->off)) ||
2238
        !EVP_MAC_final(hctx, dst, &hlen, EVP_MAC_CTX_get_mac_size(hctx))) {
2239
        ret = PTLS_ERROR_LIBRARY;
2240
        goto Exit;
2241
    }
2242
    dst += hlen;
2243
2244
    assert(dst <= buf->base + buf->capacity);
2245
    buf->off += dst - (buf->base + buf->off);
2246
    ret = 0;
2247
2248
Exit:
2249
    if (cctx != NULL)
2250
        EVP_CIPHER_CTX_free(cctx);
2251
    if (hctx != NULL)
2252
        EVP_MAC_CTX_free(hctx);
2253
    if (mac != NULL)
2254
        EVP_MAC_free(mac);
2255
    return ret;
2256
}
2257
2258
int ptls_openssl_decrypt_ticket_evp(ptls_buffer_t *buf, ptls_iovec_t src,
2259
                                    int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, EVP_MAC_CTX *hctx,
2260
                                              int enc))
2261
{
2262
    EVP_CIPHER_CTX *cctx = NULL;
2263
    EVP_MAC *mac = NULL;
2264
    EVP_MAC_CTX *hctx = NULL;
2265
    size_t hlen;
2266
    int clen, ret;
2267
2268
    if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
2269
        ret = PTLS_ERROR_NO_MEMORY;
2270
        goto Exit;
2271
    }
2272
    if ((mac = EVP_MAC_fetch(NULL, "HMAC", NULL)) == NULL) {
2273
        ret = PTLS_ERROR_NO_MEMORY;
2274
        goto Exit;
2275
    }
2276
    if ((hctx = EVP_MAC_CTX_new(mac)) == NULL) {
2277
        ret = PTLS_ERROR_NO_MEMORY;
2278
        goto Exit;
2279
    }
2280
2281
    /* obtain cipher and hash context.
2282
     * Note: no need to handle renew, since in picotls we always send a new ticket to minimize the chance of ticket reuse */
2283
    if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE) {
2284
        ret = PTLS_ALERT_DECODE_ERROR;
2285
        goto Exit;
2286
    }
2287
    if (!(*cb)(src.base, src.base + TICKET_LABEL_SIZE, cctx, hctx, 0)) {
2288
        ret = PTLS_ERROR_LIBRARY;
2289
        goto Exit;
2290
    }
2291
2292
    /* check hmac, and exclude label, iv, hmac */
2293
    size_t hmac_size = EVP_MAC_CTX_get_mac_size(hctx);
2294
    if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE + hmac_size) {
2295
        ret = PTLS_ALERT_DECODE_ERROR;
2296
        goto Exit;
2297
    }
2298
    src.len -= hmac_size;
2299
    uint8_t hmac[EVP_MAX_MD_SIZE];
2300
    if (!EVP_MAC_update(hctx, src.base, src.len) || !EVP_MAC_final(hctx, hmac, &hlen, sizeof(hmac))) {
2301
        ret = PTLS_ERROR_LIBRARY;
2302
        goto Exit;
2303
    }
2304
    if (!ptls_mem_equal(src.base + src.len, hmac, hmac_size)) {
2305
        ret = PTLS_ALERT_HANDSHAKE_FAILURE;
2306
        goto Exit;
2307
    }
2308
    src.base += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
2309
    src.len -= TICKET_LABEL_SIZE + TICKET_IV_SIZE;
2310
2311
    /* decrypt */
2312
    if ((ret = ptls_buffer_reserve(buf, src.len)) != 0)
2313
        goto Exit;
2314
    if (!EVP_DecryptUpdate(cctx, buf->base + buf->off, &clen, src.base, (int)src.len)) {
2315
        ret = PTLS_ERROR_LIBRARY;
2316
        goto Exit;
2317
    }
2318
    buf->off += clen;
2319
    if (!EVP_DecryptFinal_ex(cctx, buf->base + buf->off, &clen)) {
2320
        ret = PTLS_ERROR_LIBRARY;
2321
        goto Exit;
2322
    }
2323
    buf->off += clen;
2324
2325
    ret = 0;
2326
2327
Exit:
2328
    if (cctx != NULL)
2329
        EVP_CIPHER_CTX_free(cctx);
2330
    if (hctx != NULL)
2331
        EVP_MAC_CTX_free(hctx);
2332
    if (mac != NULL)
2333
        EVP_MAC_free(mac);
2334
    return ret;
2335
}
2336
#endif
2337
2338
ptls_key_exchange_algorithm_t ptls_openssl_secp256r1 = {.id = PTLS_GROUP_SECP256R1,
2339
                                                        .name = PTLS_GROUP_NAME_SECP256R1,
2340
                                                        .create = x9_62_create_key_exchange,
2341
                                                        .exchange = secp_key_exchange,
2342
                                                        .data = NID_X9_62_prime256v1};
2343
#if PTLS_OPENSSL_HAVE_SECP384R1
2344
ptls_key_exchange_algorithm_t ptls_openssl_secp384r1 = {.id = PTLS_GROUP_SECP384R1,
2345
                                                        .name = PTLS_GROUP_NAME_SECP384R1,
2346
                                                        .create = x9_62_create_key_exchange,
2347
                                                        .exchange = secp_key_exchange,
2348
                                                        .data = NID_secp384r1};
2349
#endif
2350
#if PTLS_OPENSSL_HAVE_SECP521R1
2351
ptls_key_exchange_algorithm_t ptls_openssl_secp521r1 = {.id = PTLS_GROUP_SECP521R1,
2352
                                                        .name = PTLS_GROUP_NAME_SECP521R1,
2353
                                                        .create = x9_62_create_key_exchange,
2354
                                                        .exchange = secp_key_exchange,
2355
                                                        .data = NID_secp521r1};
2356
#endif
2357
#if PTLS_OPENSSL_HAVE_X25519
2358
ptls_key_exchange_algorithm_t ptls_openssl_x25519 = {.id = PTLS_GROUP_X25519,
2359
                                                     .name = PTLS_GROUP_NAME_X25519,
2360
                                                     .create = evp_keyex_create,
2361
                                                     .exchange = evp_keyex_exchange,
2362
                                                     .data = NID_X25519};
2363
#endif
2364
#if defined(OPENSSL_IS_BORINGSSL) && PTLS_OPENSSL_HAVE_X25519MLKEM768
2365
ptls_key_exchange_algorithm_t ptls_openssl_x25519mlkem768 = {.id = PTLS_GROUP_X25519MLKEM768,
2366
                                                             .name = PTLS_GROUP_NAME_X25519MLKEM768,
2367
                                                             .create = x25519mlkem768_create,
2368
                                                             .exchange = x25519mlkem768_exchange};
2369
#endif
2370
#if PTLS_OPENSSL_HAVE_MLKEM
2371
#define DEFINE_MLKEM_KEYEX(lowcase, upcase)                                                                                        \
2372
    ptls_key_exchange_algorithm_t ptls_openssl_##lowcase = {.id = PTLS_GROUP_##upcase,                                             \
2373
                                                            .name = PTLS_GROUP_NAME_##upcase,                                      \
2374
                                                            .create = evp_kem_create,                                              \
2375
                                                            .exchange = evp_kem_exchange,                                          \
2376
                                                            .data = (intptr_t)PTLS_GROUP_NAME_##upcase}
2377
DEFINE_MLKEM_KEYEX(x25519mlkem768, X25519MLKEM768);
2378
DEFINE_MLKEM_KEYEX(secp256r1mlkem768, SECP256R1MLKEM768);
2379
DEFINE_MLKEM_KEYEX(secp384r1mlkem1024, SECP384R1MLKEM1024);
2380
DEFINE_MLKEM_KEYEX(mlkem512, MLKEM512);
2381
DEFINE_MLKEM_KEYEX(mlkem768, MLKEM768);
2382
DEFINE_MLKEM_KEYEX(mlkem1024, MLKEM1024);
2383
#undef DEFINE_MLKEM_KEYEX
2384
#endif
2385
2386
ptls_key_exchange_algorithm_t *ptls_openssl_key_exchanges[] = {&ptls_openssl_secp256r1, NULL};
2387
ptls_key_exchange_algorithm_t *ptls_openssl_key_exchanges_all[] = {
2388
#if PTLS_OPENSSL_HAVE_X25519MLKEM768
2389
    &ptls_openssl_x25519mlkem768,
2390
#endif
2391
#if PTLS_OPENSSL_HAVE_SECP521R1
2392
    &ptls_openssl_secp521r1,
2393
#endif
2394
#if PTLS_OPENSSL_HAVE_SECP384R1
2395
    &ptls_openssl_secp384r1,
2396
#endif
2397
#if PTLS_OPENSSL_HAVE_X25519
2398
    &ptls_openssl_x25519,
2399
#endif
2400
#if PTLS_OPENSSL_HAVE_MLKEM
2401
    &ptls_openssl_secp384r1mlkem1024,
2402
    &ptls_openssl_secp256r1mlkem768,
2403
    &ptls_openssl_mlkem1024,
2404
    &ptls_openssl_mlkem768,
2405
    &ptls_openssl_mlkem512,
2406
#endif
2407
    &ptls_openssl_secp256r1,
2408
    NULL};
2409
ptls_cipher_algorithm_t ptls_openssl_aes128ecb = {
2410
    "AES128-ECB",          PTLS_AES128_KEY_SIZE, PTLS_AES_BLOCK_SIZE, 0 /* iv size */, sizeof(struct cipher_context_t),
2411
    aes128ecb_setup_crypto};
2412
ptls_cipher_algorithm_t ptls_openssl_aes128ctr = {
2413
    "AES128-CTR", PTLS_AES128_KEY_SIZE, 1, PTLS_AES_IV_SIZE, sizeof(struct cipher_context_t), aes128ctr_setup_crypto};
2414
ptls_aead_algorithm_t ptls_openssl_aes128gcm = {"AES128-GCM",
2415
                                                PTLS_AESGCM_CONFIDENTIALITY_LIMIT,
2416
                                                PTLS_AESGCM_INTEGRITY_LIMIT,
2417
                                                &ptls_openssl_aes128ctr,
2418
                                                &ptls_openssl_aes128ecb,
2419
                                                PTLS_AES128_KEY_SIZE,
2420
                                                PTLS_AESGCM_IV_SIZE,
2421
                                                PTLS_AESGCM_TAG_SIZE,
2422
                                                {PTLS_TLS12_AESGCM_FIXED_IV_SIZE, PTLS_TLS12_AESGCM_RECORD_IV_SIZE},
2423
                                                0,
2424
                                                0,
2425
                                                sizeof(struct aead_crypto_context_t),
2426
                                                aead_aes128gcm_setup_crypto};
2427
ptls_cipher_algorithm_t ptls_openssl_aes256ecb = {
2428
    "AES256-ECB",          PTLS_AES256_KEY_SIZE, PTLS_AES_BLOCK_SIZE, 0 /* iv size */, sizeof(struct cipher_context_t),
2429
    aes256ecb_setup_crypto};
2430
ptls_cipher_algorithm_t ptls_openssl_aes256ctr = {
2431
    "AES256-CTR",          PTLS_AES256_KEY_SIZE, 1 /* block size */, PTLS_AES_IV_SIZE, sizeof(struct cipher_context_t),
2432
    aes256ctr_setup_crypto};
2433
ptls_aead_algorithm_t ptls_openssl_aes256gcm = {"AES256-GCM",
2434
                                                PTLS_AESGCM_CONFIDENTIALITY_LIMIT,
2435
                                                PTLS_AESGCM_INTEGRITY_LIMIT,
2436
                                                &ptls_openssl_aes256ctr,
2437
                                                &ptls_openssl_aes256ecb,
2438
                                                PTLS_AES256_KEY_SIZE,
2439
                                                PTLS_AESGCM_IV_SIZE,
2440
                                                PTLS_AESGCM_TAG_SIZE,
2441
                                                {PTLS_TLS12_AESGCM_FIXED_IV_SIZE, PTLS_TLS12_AESGCM_RECORD_IV_SIZE},
2442
                                                0,
2443
                                                0,
2444
                                                sizeof(struct aead_crypto_context_t),
2445
                                                aead_aes256gcm_setup_crypto};
2446
ptls_hash_algorithm_t ptls_openssl_sha256 = {"sha256", PTLS_SHA256_BLOCK_SIZE, PTLS_SHA256_DIGEST_SIZE, sha256_create,
2447
                                             PTLS_ZERO_DIGEST_SHA256};
2448
ptls_hash_algorithm_t ptls_openssl_sha384 = {"sha384", PTLS_SHA384_BLOCK_SIZE, PTLS_SHA384_DIGEST_SIZE, sha384_create,
2449
                                             PTLS_ZERO_DIGEST_SHA384};
2450
ptls_hash_algorithm_t ptls_openssl_sha512 = {"sha512", PTLS_SHA512_BLOCK_SIZE, PTLS_SHA512_DIGEST_SIZE, sha512_create,
2451
                                             PTLS_ZERO_DIGEST_SHA512};
2452
ptls_cipher_suite_t ptls_openssl_aes128gcmsha256 = {.id = PTLS_CIPHER_SUITE_AES_128_GCM_SHA256,
2453
                                                    .name = PTLS_CIPHER_SUITE_NAME_AES_128_GCM_SHA256,
2454
                                                    .aead = &ptls_openssl_aes128gcm,
2455
                                                    .hash = &ptls_openssl_sha256};
2456
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_rsa_aes128gcmsha256 = {.id = PTLS_CIPHER_SUITE_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
2457
                                                                    .name =
2458
                                                                        PTLS_CIPHER_SUITE_NAME_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
2459
                                                                    .aead = &ptls_openssl_aes128gcm,
2460
                                                                    .hash = &ptls_openssl_sha256};
2461
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_ecdsa_aes128gcmsha256 = {
2462
    .id = PTLS_CIPHER_SUITE_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
2463
    .name = PTLS_CIPHER_SUITE_NAME_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
2464
    .aead = &ptls_openssl_aes128gcm,
2465
    .hash = &ptls_openssl_sha256};
2466
ptls_cipher_suite_t ptls_openssl_aes256gcmsha384 = {.id = PTLS_CIPHER_SUITE_AES_256_GCM_SHA384,
2467
                                                    .name = PTLS_CIPHER_SUITE_NAME_AES_256_GCM_SHA384,
2468
                                                    .aead = &ptls_openssl_aes256gcm,
2469
                                                    .hash = &ptls_openssl_sha384};
2470
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_rsa_aes256gcmsha384 = {.id = PTLS_CIPHER_SUITE_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
2471
                                                                    .name =
2472
                                                                        PTLS_CIPHER_SUITE_NAME_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
2473
                                                                    .aead = &ptls_openssl_aes256gcm,
2474
                                                                    .hash = &ptls_openssl_sha384};
2475
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_ecdsa_aes256gcmsha384 = {
2476
    .id = PTLS_CIPHER_SUITE_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
2477
    .name = PTLS_CIPHER_SUITE_NAME_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
2478
    .aead = &ptls_openssl_aes256gcm,
2479
    .hash = &ptls_openssl_sha384};
2480
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2481
ptls_cipher_algorithm_t ptls_openssl_chacha20 = {
2482
    .name = "CHACHA20",
2483
    .key_size = PTLS_CHACHA20_KEY_SIZE,
2484
    .block_size = 1,
2485
    .iv_size = PTLS_CHACHA20_IV_SIZE,
2486
#ifdef OPENSSL_IS_BORINGSSL
2487
    .context_size = sizeof(struct boringssl_chacha20_context_t),
2488
    .setup_crypto = boringssl_chacha20_setup_crypto,
2489
#else
2490
    .context_size = sizeof(struct cipher_context_t),
2491
    .setup_crypto = chacha20_setup_crypto,
2492
#endif
2493
};
2494
ptls_aead_algorithm_t ptls_openssl_chacha20poly1305 = {
2495
    .name = "CHACHA20-POLY1305",
2496
    .confidentiality_limit = PTLS_CHACHA20POLY1305_CONFIDENTIALITY_LIMIT,
2497
    .integrity_limit = PTLS_CHACHA20POLY1305_INTEGRITY_LIMIT,
2498
    .ctr_cipher = &ptls_openssl_chacha20,
2499
    .ecb_cipher = NULL,
2500
    .key_size = PTLS_CHACHA20_KEY_SIZE,
2501
    .iv_size = PTLS_CHACHA20POLY1305_IV_SIZE,
2502
    .tag_size = PTLS_CHACHA20POLY1305_TAG_SIZE,
2503
    .tls12 = {.fixed_iv_size = PTLS_TLS12_CHACHAPOLY_FIXED_IV_SIZE, .record_iv_size = PTLS_TLS12_CHACHAPOLY_RECORD_IV_SIZE},
2504
    .non_temporal = 0,
2505
    .align_bits = 0,
2506
#ifdef OPENSSL_IS_BORINGSSL
2507
    .context_size = sizeof(struct boringssl_chacha20poly1305_context_t),
2508
    .setup_crypto = boringssl_chacha20poly1305_setup_crypto,
2509
#else
2510
    .context_size = sizeof(struct aead_crypto_context_t),
2511
    .setup_crypto = aead_chacha20poly1305_setup_crypto,
2512
#endif
2513
};
2514
ptls_cipher_suite_t ptls_openssl_chacha20poly1305sha256 = {.id = PTLS_CIPHER_SUITE_CHACHA20_POLY1305_SHA256,
2515
                                                           .name = PTLS_CIPHER_SUITE_NAME_CHACHA20_POLY1305_SHA256,
2516
                                                           .aead = &ptls_openssl_chacha20poly1305,
2517
                                                           .hash = &ptls_openssl_sha256};
2518
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_rsa_chacha20poly1305sha256 = {
2519
    .id = PTLS_CIPHER_SUITE_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
2520
    .name = PTLS_CIPHER_SUITE_NAME_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
2521
    .aead = &ptls_openssl_chacha20poly1305,
2522
    .hash = &ptls_openssl_sha256};
2523
ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_ecdsa_chacha20poly1305sha256 = {
2524
    .id = PTLS_CIPHER_SUITE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
2525
    .name = PTLS_CIPHER_SUITE_NAME_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
2526
    .aead = &ptls_openssl_chacha20poly1305,
2527
    .hash = &ptls_openssl_sha256};
2528
#endif
2529
2530
#if PTLS_HAVE_AEGIS
2531
ptls_aead_algorithm_t ptls_openssl_aegis128l = {
2532
    .name = "AEGIS-128L",
2533
    .confidentiality_limit = PTLS_AEGIS128L_CONFIDENTIALITY_LIMIT,
2534
    .integrity_limit = PTLS_AEGIS128L_INTEGRITY_LIMIT,
2535
    .ctr_cipher = NULL,
2536
    .ecb_cipher = NULL,
2537
    .key_size = PTLS_AEGIS128L_KEY_SIZE,
2538
    .iv_size = PTLS_AEGIS128L_IV_SIZE,
2539
    .tag_size = PTLS_AEGIS128L_TAG_SIZE,
2540
    .tls12 = {.fixed_iv_size = 0, .record_iv_size = 0},
2541
    .non_temporal = 0,
2542
    .align_bits = 0,
2543
    .context_size = sizeof(struct aegis128l_context_t),
2544
    .setup_crypto = aegis128l_setup_crypto,
2545
};
2546
ptls_cipher_suite_t ptls_openssl_aegis128lsha256 = {.id = PTLS_CIPHER_SUITE_AEGIS128L_SHA256,
2547
                                                    .name = PTLS_CIPHER_SUITE_NAME_AEGIS128L_SHA256,
2548
                                                    .aead = &ptls_openssl_aegis128l,
2549
                                                    .hash = &ptls_openssl_sha256};
2550
2551
ptls_aead_algorithm_t ptls_openssl_aegis256 = {
2552
    .name = "AEGIS-256",
2553
    .confidentiality_limit = PTLS_AEGIS256_CONFIDENTIALITY_LIMIT,
2554
    .integrity_limit = PTLS_AEGIS256_INTEGRITY_LIMIT,
2555
    .ctr_cipher = NULL,
2556
    .ecb_cipher = NULL,
2557
    .key_size = PTLS_AEGIS256_KEY_SIZE,
2558
    .iv_size = PTLS_AEGIS256_IV_SIZE,
2559
    .tag_size = PTLS_AEGIS256_TAG_SIZE,
2560
    .tls12 = {.fixed_iv_size = 0, .record_iv_size = 0},
2561
    .non_temporal = 0,
2562
    .align_bits = 0,
2563
    .context_size = sizeof(struct aegis256_context_t),
2564
    .setup_crypto = aegis256_setup_crypto,
2565
};
2566
ptls_cipher_suite_t ptls_openssl_aegis256sha512 = {.id = PTLS_CIPHER_SUITE_AEGIS256_SHA512,
2567
                                                   .name = PTLS_CIPHER_SUITE_NAME_AEGIS256_SHA512,
2568
                                                   .aead = &ptls_openssl_aegis256,
2569
                                                   .hash = &ptls_openssl_sha512};
2570
#endif
2571
2572
ptls_cipher_suite_t *ptls_openssl_cipher_suites[] = { // ciphers used with sha384 (must be first)
2573
    &ptls_openssl_aes256gcmsha384,
2574
2575
    // ciphers used with sha256
2576
    &ptls_openssl_aes128gcmsha256,
2577
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2578
    &ptls_openssl_chacha20poly1305sha256,
2579
#endif
2580
    NULL};
2581
2582
ptls_cipher_suite_t *ptls_openssl_cipher_suites_all[] = { // ciphers used with sha384 (must be first)
2583
#if PTLS_HAVE_AEGIS
2584
    &ptls_openssl_aegis256sha512,
2585
#endif
2586
    &ptls_openssl_aes256gcmsha384,
2587
2588
// ciphers used with sha256
2589
#if PTLS_HAVE_AEGIS
2590
    &ptls_openssl_aegis128lsha256,
2591
#endif
2592
    &ptls_openssl_aes128gcmsha256,
2593
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2594
    &ptls_openssl_chacha20poly1305sha256,
2595
#endif
2596
    NULL};
2597
2598
ptls_cipher_suite_t *ptls_openssl_tls12_cipher_suites[] = {&ptls_openssl_tls12_ecdhe_rsa_aes128gcmsha256,
2599
                                                           &ptls_openssl_tls12_ecdhe_ecdsa_aes128gcmsha256,
2600
                                                           &ptls_openssl_tls12_ecdhe_rsa_aes256gcmsha384,
2601
                                                           &ptls_openssl_tls12_ecdhe_ecdsa_aes256gcmsha384,
2602
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2603
                                                           &ptls_openssl_tls12_ecdhe_rsa_chacha20poly1305sha256,
2604
                                                           &ptls_openssl_tls12_ecdhe_ecdsa_chacha20poly1305sha256,
2605
#endif
2606
                                                           NULL};
2607
2608
#if PTLS_OPENSSL_HAVE_BF
2609
ptls_cipher_algorithm_t ptls_openssl_bfecb = {"BF-ECB",        PTLS_BLOWFISH_KEY_SIZE,          PTLS_BLOWFISH_BLOCK_SIZE,
2610
                                              0 /* iv size */, sizeof(struct cipher_context_t), bfecb_setup_crypto};
2611
#endif
2612
2613
ptls_hpke_kem_t ptls_openssl_hpke_kem_p256sha256 = {PTLS_HPKE_KEM_P256_SHA256, &ptls_openssl_secp256r1, &ptls_openssl_sha256};
2614
ptls_hpke_kem_t ptls_openssl_hpke_kem_p384sha384 = {PTLS_HPKE_KEM_P384_SHA384, &ptls_openssl_secp384r1, &ptls_openssl_sha384};
2615
#if PTLS_OPENSSL_HAVE_X25519
2616
ptls_hpke_kem_t ptls_openssl_hpke_kem_x25519sha256 = {PTLS_HPKE_KEM_X25519_SHA256, &ptls_openssl_x25519, &ptls_openssl_sha256};
2617
#endif
2618
ptls_hpke_kem_t *ptls_openssl_hpke_kems[] = {&ptls_openssl_hpke_kem_p384sha384,
2619
#if PTLS_OPENSSL_HAVE_X25519
2620
                                             &ptls_openssl_hpke_kem_x25519sha256,
2621
#endif
2622
                                             &ptls_openssl_hpke_kem_p256sha256, NULL};
2623
2624
ptls_hpke_cipher_suite_t ptls_openssl_hpke_aes128gcmsha256 = {
2625
    .id = {.kdf = PTLS_HPKE_HKDF_SHA256, .aead = PTLS_HPKE_AEAD_AES_128_GCM},
2626
    .name = "HKDF-SHA256/AES-128-GCM",
2627
    .hash = &ptls_openssl_sha256,
2628
    .aead = &ptls_openssl_aes128gcm};
2629
ptls_hpke_cipher_suite_t ptls_openssl_hpke_aes128gcmsha512 = {
2630
    .id = {.kdf = PTLS_HPKE_HKDF_SHA512, .aead = PTLS_HPKE_AEAD_AES_128_GCM},
2631
    .name = "HKDF-SHA512/AES-128-GCM",
2632
    .hash = &ptls_openssl_sha512,
2633
    .aead = &ptls_openssl_aes128gcm};
2634
ptls_hpke_cipher_suite_t ptls_openssl_hpke_aes256gcmsha384 = {
2635
    .id = {.kdf = PTLS_HPKE_HKDF_SHA384, .aead = PTLS_HPKE_AEAD_AES_256_GCM},
2636
    .name = "HKDF-SHA384/AES-256-GCM",
2637
    .hash = &ptls_openssl_sha384,
2638
    .aead = &ptls_openssl_aes256gcm};
2639
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2640
ptls_hpke_cipher_suite_t ptls_openssl_hpke_chacha20poly1305sha256 = {
2641
    .id = {.kdf = PTLS_HPKE_HKDF_SHA256, .aead = PTLS_HPKE_AEAD_CHACHA20POLY1305},
2642
    .name = "HKDF-SHA256/ChaCha20Poly1305",
2643
    .hash = &ptls_openssl_sha256,
2644
    .aead = &ptls_openssl_chacha20poly1305};
2645
#endif
2646
ptls_hpke_cipher_suite_t *ptls_openssl_hpke_cipher_suites[] = {&ptls_openssl_hpke_aes128gcmsha256,
2647
                                                               &ptls_openssl_hpke_aes256gcmsha384,
2648
#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
2649
                                                               &ptls_openssl_hpke_chacha20poly1305sha256,
2650
#endif
2651
                                                               &ptls_openssl_hpke_aes128gcmsha512, /* likely only for tests */
2652
                                                               NULL};