Coverage Report

Created: 2025-11-07 07:05

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