Coverage Report

Created: 2026-05-11 06:45

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/boringssl/fuzz/ssl_ctx_api.cc
Line
Count
Source
1
// Copyright 2016 The BoringSSL Authors
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     https://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#include <functional>
16
#include <iterator>
17
#include <string>
18
#include <type_traits>
19
#include <vector>
20
21
#include <assert.h>
22
23
#include <openssl/bytestring.h>
24
#include <openssl/err.h>
25
#include <openssl/evp.h>
26
#include <openssl/hpke.h>
27
#include <openssl/rsa.h>
28
#include <openssl/ssl.h>
29
#include <openssl/stack.h>
30
#include <openssl/x509.h>
31
32
#include "../crypto/internal.h"
33
34
using namespace bssl;
35
36
static const uint8_t kCertificateDER[] = {
37
    0x30, 0x82, 0x02, 0xff, 0x30, 0x82, 0x01, 0xe7, 0xa0, 0x03, 0x02, 0x01,
38
    0x02, 0x02, 0x11, 0x00, 0xb1, 0x84, 0xee, 0x34, 0x99, 0x98, 0x76, 0xfb,
39
    0x6f, 0xb2, 0x15, 0xc8, 0x47, 0x79, 0x05, 0x9b, 0x30, 0x0d, 0x06, 0x09,
40
    0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30,
41
    0x12, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07,
42
    0x41, 0x63, 0x6d, 0x65, 0x20, 0x43, 0x6f, 0x30, 0x1e, 0x17, 0x0d, 0x31,
43
    0x35, 0x31, 0x31, 0x30, 0x37, 0x30, 0x30, 0x32, 0x34, 0x35, 0x36, 0x5a,
44
    0x17, 0x0d, 0x31, 0x36, 0x31, 0x31, 0x30, 0x36, 0x30, 0x30, 0x32, 0x34,
45
    0x35, 0x36, 0x5a, 0x30, 0x12, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55,
46
    0x04, 0x0a, 0x13, 0x07, 0x41, 0x63, 0x6d, 0x65, 0x20, 0x43, 0x6f, 0x30,
47
    0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
48
    0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,
49
    0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xce, 0x47, 0xcb, 0x11,
50
    0xbb, 0xd2, 0x9d, 0x8e, 0x9e, 0xd2, 0x1e, 0x14, 0xaf, 0xc7, 0xea, 0xb6,
51
    0xc9, 0x38, 0x2a, 0x6f, 0xb3, 0x7e, 0xfb, 0xbc, 0xfc, 0x59, 0x42, 0xb9,
52
    0x56, 0xf0, 0x4c, 0x3f, 0xf7, 0x31, 0x84, 0xbe, 0xac, 0x03, 0x9e, 0x71,
53
    0x91, 0x85, 0xd8, 0x32, 0xbd, 0x00, 0xea, 0xac, 0x65, 0xf6, 0x03, 0xc8,
54
    0x0f, 0x8b, 0xfd, 0x6e, 0x58, 0x88, 0x04, 0x41, 0x92, 0x74, 0xa6, 0x57,
55
    0x2e, 0x8e, 0x88, 0xd5, 0x3d, 0xda, 0x14, 0x3e, 0x63, 0x88, 0x22, 0xe3,
56
    0x53, 0xe9, 0xba, 0x39, 0x09, 0xac, 0xfb, 0xd0, 0x4c, 0xf2, 0x3c, 0x20,
57
    0xd6, 0x97, 0xe6, 0xed, 0xf1, 0x62, 0x1e, 0xe5, 0xc9, 0x48, 0xa0, 0xca,
58
    0x2e, 0x3c, 0x14, 0x5a, 0x82, 0xd4, 0xed, 0xb1, 0xe3, 0x43, 0xc1, 0x2a,
59
    0x59, 0xa5, 0xb9, 0xc8, 0x48, 0xa7, 0x39, 0x23, 0x74, 0xa7, 0x37, 0xb0,
60
    0x6f, 0xc3, 0x64, 0x99, 0x6c, 0xa2, 0x82, 0xc8, 0xf6, 0xdb, 0x86, 0x40,
61
    0xce, 0xd1, 0x85, 0x9f, 0xce, 0x69, 0xf4, 0x15, 0x2a, 0x23, 0xca, 0xea,
62
    0xb7, 0x7b, 0xdf, 0xfb, 0x43, 0x5f, 0xff, 0x7a, 0x49, 0x49, 0x0e, 0xe7,
63
    0x02, 0x51, 0x45, 0x13, 0xe8, 0x90, 0x64, 0x21, 0x0c, 0x26, 0x2b, 0x5d,
64
    0xfc, 0xe4, 0xb5, 0x86, 0x89, 0x43, 0x22, 0x4c, 0xf3, 0x3b, 0xf3, 0x09,
65
    0xc4, 0xa4, 0x10, 0x80, 0xf2, 0x46, 0xe2, 0x46, 0x8f, 0x76, 0x50, 0xbf,
66
    0xaf, 0x2b, 0x90, 0x1b, 0x78, 0xc7, 0xcf, 0xc1, 0x77, 0xd0, 0xfb, 0xa9,
67
    0xfb, 0xc9, 0x66, 0x5a, 0xc5, 0x9b, 0x31, 0x41, 0x67, 0x01, 0xbe, 0x33,
68
    0x10, 0xba, 0x05, 0x58, 0xed, 0x76, 0x53, 0xde, 0x5d, 0xc1, 0xe8, 0xbb,
69
    0x9f, 0xf1, 0xcd, 0xfb, 0xdf, 0x64, 0x7f, 0xd7, 0x18, 0xab, 0x0f, 0x94,
70
    0x28, 0x95, 0x4a, 0xcc, 0x6a, 0xa9, 0x50, 0xc7, 0x05, 0x47, 0x10, 0x41,
71
    0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x50, 0x30, 0x4e, 0x30, 0x0e, 0x06,
72
    0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x05,
73
    0xa0, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a,
74
    0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x30, 0x0c,
75
    0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x02, 0x30, 0x00,
76
    0x30, 0x19, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x12, 0x30, 0x10, 0x82,
77
    0x0e, 0x66, 0x75, 0x7a, 0x7a, 0x2e, 0x62, 0x6f, 0x72, 0x69, 0x6e, 0x67,
78
    0x73, 0x73, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
79
    0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x92,
80
    0xde, 0xef, 0x96, 0x06, 0x7b, 0xff, 0x71, 0x7d, 0x4e, 0xa0, 0x7d, 0xae,
81
    0xb8, 0x22, 0xb4, 0x2c, 0xf7, 0x96, 0x9c, 0x37, 0x1d, 0x8f, 0xe7, 0xd9,
82
    0x47, 0xff, 0x3f, 0xe9, 0x35, 0x95, 0x0e, 0xdd, 0xdc, 0x7f, 0xc8, 0x8a,
83
    0x1e, 0x36, 0x1d, 0x38, 0x47, 0xfc, 0x76, 0xd2, 0x1f, 0x98, 0xa1, 0x36,
84
    0xac, 0xc8, 0x70, 0x38, 0x0a, 0x3d, 0x51, 0x8d, 0x0f, 0x03, 0x1b, 0xef,
85
    0x62, 0xa1, 0xcb, 0x2b, 0x4a, 0x8c, 0x12, 0x2b, 0x54, 0x50, 0x9a, 0x6b,
86
    0xfe, 0xaf, 0xd9, 0xf6, 0xbf, 0x58, 0x11, 0x58, 0x5e, 0xe5, 0x86, 0x1e,
87
    0x3b, 0x6b, 0x30, 0x7e, 0x72, 0x89, 0xe8, 0x6b, 0x7b, 0xb7, 0xaf, 0xef,
88
    0x8b, 0xa9, 0x3e, 0xb0, 0xcd, 0x0b, 0xef, 0xb0, 0x0c, 0x96, 0x2b, 0xc5,
89
    0x3b, 0xd5, 0xf1, 0xc2, 0xae, 0x3a, 0x60, 0xd9, 0x0f, 0x75, 0x37, 0x55,
90
    0x4d, 0x62, 0xd2, 0xed, 0x96, 0xac, 0x30, 0x6b, 0xda, 0xa1, 0x48, 0x17,
91
    0x96, 0x23, 0x85, 0x9a, 0x57, 0x77, 0xe9, 0x22, 0xa2, 0x37, 0x03, 0xba,
92
    0x49, 0x77, 0x40, 0x3b, 0x76, 0x4b, 0xda, 0xc1, 0x04, 0x57, 0x55, 0x34,
93
    0x22, 0x83, 0x45, 0x29, 0xab, 0x2e, 0x11, 0xff, 0x0d, 0xab, 0x55, 0xb1,
94
    0xa7, 0x58, 0x59, 0x05, 0x25, 0xf9, 0x1e, 0x3d, 0xb7, 0xac, 0x04, 0x39,
95
    0x2c, 0xf9, 0xaf, 0xb8, 0x68, 0xfb, 0x8e, 0x35, 0x71, 0x32, 0xff, 0x70,
96
    0xe9, 0x46, 0x6d, 0x5c, 0x06, 0x90, 0x88, 0x23, 0x48, 0x0c, 0x50, 0xeb,
97
    0x0a, 0xa9, 0xae, 0xe8, 0xfc, 0xbe, 0xa5, 0x76, 0x94, 0xd7, 0x64, 0x22,
98
    0x38, 0x98, 0x17, 0xa4, 0x3a, 0xa7, 0x59, 0x9f, 0x1d, 0x3b, 0x75, 0x90,
99
    0x1a, 0x81, 0xef, 0x19, 0xfb, 0x2b, 0xb7, 0xa7, 0x64, 0x61, 0x22, 0xa4,
100
    0x6f, 0x7b, 0xfa, 0x58, 0xbb, 0x8c, 0x4e, 0x77, 0x67, 0xd0, 0x5d, 0x58,
101
    0x76, 0x8a, 0xbb,
102
};
103
104
static const uint8_t kRSAPrivateKeyDER[] = {
105
    0x30, 0x82, 0x04, 0xa5, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
106
    0xce, 0x47, 0xcb, 0x11, 0xbb, 0xd2, 0x9d, 0x8e, 0x9e, 0xd2, 0x1e, 0x14,
107
    0xaf, 0xc7, 0xea, 0xb6, 0xc9, 0x38, 0x2a, 0x6f, 0xb3, 0x7e, 0xfb, 0xbc,
108
    0xfc, 0x59, 0x42, 0xb9, 0x56, 0xf0, 0x4c, 0x3f, 0xf7, 0x31, 0x84, 0xbe,
109
    0xac, 0x03, 0x9e, 0x71, 0x91, 0x85, 0xd8, 0x32, 0xbd, 0x00, 0xea, 0xac,
110
    0x65, 0xf6, 0x03, 0xc8, 0x0f, 0x8b, 0xfd, 0x6e, 0x58, 0x88, 0x04, 0x41,
111
    0x92, 0x74, 0xa6, 0x57, 0x2e, 0x8e, 0x88, 0xd5, 0x3d, 0xda, 0x14, 0x3e,
112
    0x63, 0x88, 0x22, 0xe3, 0x53, 0xe9, 0xba, 0x39, 0x09, 0xac, 0xfb, 0xd0,
113
    0x4c, 0xf2, 0x3c, 0x20, 0xd6, 0x97, 0xe6, 0xed, 0xf1, 0x62, 0x1e, 0xe5,
114
    0xc9, 0x48, 0xa0, 0xca, 0x2e, 0x3c, 0x14, 0x5a, 0x82, 0xd4, 0xed, 0xb1,
115
    0xe3, 0x43, 0xc1, 0x2a, 0x59, 0xa5, 0xb9, 0xc8, 0x48, 0xa7, 0x39, 0x23,
116
    0x74, 0xa7, 0x37, 0xb0, 0x6f, 0xc3, 0x64, 0x99, 0x6c, 0xa2, 0x82, 0xc8,
117
    0xf6, 0xdb, 0x86, 0x40, 0xce, 0xd1, 0x85, 0x9f, 0xce, 0x69, 0xf4, 0x15,
118
    0x2a, 0x23, 0xca, 0xea, 0xb7, 0x7b, 0xdf, 0xfb, 0x43, 0x5f, 0xff, 0x7a,
119
    0x49, 0x49, 0x0e, 0xe7, 0x02, 0x51, 0x45, 0x13, 0xe8, 0x90, 0x64, 0x21,
120
    0x0c, 0x26, 0x2b, 0x5d, 0xfc, 0xe4, 0xb5, 0x86, 0x89, 0x43, 0x22, 0x4c,
121
    0xf3, 0x3b, 0xf3, 0x09, 0xc4, 0xa4, 0x10, 0x80, 0xf2, 0x46, 0xe2, 0x46,
122
    0x8f, 0x76, 0x50, 0xbf, 0xaf, 0x2b, 0x90, 0x1b, 0x78, 0xc7, 0xcf, 0xc1,
123
    0x77, 0xd0, 0xfb, 0xa9, 0xfb, 0xc9, 0x66, 0x5a, 0xc5, 0x9b, 0x31, 0x41,
124
    0x67, 0x01, 0xbe, 0x33, 0x10, 0xba, 0x05, 0x58, 0xed, 0x76, 0x53, 0xde,
125
    0x5d, 0xc1, 0xe8, 0xbb, 0x9f, 0xf1, 0xcd, 0xfb, 0xdf, 0x64, 0x7f, 0xd7,
126
    0x18, 0xab, 0x0f, 0x94, 0x28, 0x95, 0x4a, 0xcc, 0x6a, 0xa9, 0x50, 0xc7,
127
    0x05, 0x47, 0x10, 0x41, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01,
128
    0x01, 0x00, 0xa8, 0x47, 0xb9, 0x4a, 0x06, 0x47, 0x93, 0x71, 0x3d, 0xef,
129
    0x7b, 0xca, 0xb4, 0x7c, 0x0a, 0xe6, 0x82, 0xd0, 0xe7, 0x0d, 0xa9, 0x08,
130
    0xf6, 0xa4, 0xfd, 0xd8, 0x73, 0xae, 0x6f, 0x56, 0x29, 0x5e, 0x25, 0x72,
131
    0xa8, 0x30, 0x44, 0x73, 0xcf, 0x56, 0x26, 0xb9, 0x61, 0xde, 0x42, 0x81,
132
    0xf4, 0xf0, 0x1f, 0x5d, 0xcb, 0x47, 0xf2, 0x26, 0xe9, 0xe0, 0x93, 0x28,
133
    0xa3, 0x10, 0x3b, 0x42, 0x1e, 0x51, 0x11, 0x12, 0x06, 0x5e, 0xaf, 0xce,
134
    0xb0, 0xa5, 0x14, 0xdd, 0x82, 0x58, 0xa1, 0xa4, 0x12, 0xdf, 0x65, 0x1d,
135
    0x51, 0x70, 0x64, 0xd5, 0x58, 0x68, 0x11, 0xa8, 0x6a, 0x23, 0xc2, 0xbf,
136
    0xa1, 0x25, 0x24, 0x47, 0xb3, 0xa4, 0x3c, 0x83, 0x96, 0xb7, 0x1f, 0xf4,
137
    0x44, 0xd4, 0xd1, 0xe9, 0xfc, 0x33, 0x68, 0x5e, 0xe2, 0x68, 0x99, 0x9c,
138
    0x91, 0xe8, 0x72, 0xc9, 0xd7, 0x8c, 0x80, 0x20, 0x8e, 0x77, 0x83, 0x4d,
139
    0xe4, 0xab, 0xf9, 0x74, 0xa1, 0xdf, 0xd3, 0xc0, 0x0d, 0x5b, 0x05, 0x51,
140
    0xc2, 0x6f, 0xb2, 0x91, 0x02, 0xec, 0xc0, 0x02, 0x1a, 0x5c, 0x91, 0x05,
141
    0xf1, 0xe3, 0xfa, 0x65, 0xc2, 0xad, 0x24, 0xe6, 0xe5, 0x3c, 0xb6, 0x16,
142
    0xf1, 0xa1, 0x67, 0x1a, 0x9d, 0x37, 0x56, 0xbf, 0x01, 0xd7, 0x3b, 0x35,
143
    0x30, 0x57, 0x73, 0xf4, 0xf0, 0x5e, 0xa7, 0xe8, 0x0a, 0xc1, 0x94, 0x17,
144
    0xcf, 0x0a, 0xbd, 0xf5, 0x31, 0xa7, 0x2d, 0xf7, 0xf5, 0xd9, 0x8c, 0xc2,
145
    0x01, 0xbd, 0xda, 0x16, 0x8e, 0xb9, 0x30, 0x40, 0xa6, 0x6e, 0xbd, 0xcd,
146
    0x4d, 0x84, 0x67, 0x4e, 0x0b, 0xce, 0xd5, 0xef, 0xf8, 0x08, 0x63, 0x02,
147
    0xc6, 0xc7, 0xf7, 0x67, 0x92, 0xe2, 0x23, 0x9d, 0x27, 0x22, 0x1d, 0xc6,
148
    0x67, 0x5e, 0x66, 0xbf, 0x03, 0xb8, 0xa9, 0x67, 0xd4, 0x39, 0xd8, 0x75,
149
    0xfa, 0xe8, 0xed, 0x56, 0xb8, 0x81, 0x02, 0x81, 0x81, 0x00, 0xf7, 0x46,
150
    0x68, 0xc6, 0x13, 0xf8, 0xba, 0x0f, 0x83, 0xdb, 0x05, 0xa8, 0x25, 0x00,
151
    0x70, 0x9c, 0x9e, 0x8b, 0x12, 0x34, 0x0d, 0x96, 0xcf, 0x0d, 0x98, 0x9b,
152
    0x8d, 0x9c, 0x96, 0x78, 0xd1, 0x3c, 0x01, 0x8c, 0xb9, 0x35, 0x5c, 0x20,
153
    0x42, 0xb4, 0x38, 0xe3, 0xd6, 0x54, 0xe7, 0x55, 0xd6, 0x26, 0x8a, 0x0c,
154
    0xf6, 0x1f, 0xe0, 0x04, 0xc1, 0x22, 0x42, 0x19, 0x61, 0xc4, 0x94, 0x7c,
155
    0x07, 0x2e, 0x80, 0x52, 0xfe, 0x8d, 0xe6, 0x92, 0x3a, 0x91, 0xfe, 0x72,
156
    0x99, 0xe1, 0x2a, 0x73, 0x76, 0xb1, 0x24, 0x20, 0x67, 0xde, 0x28, 0xcb,
157
    0x0e, 0xe6, 0x52, 0xb5, 0xfa, 0xfb, 0x8b, 0x1e, 0x6a, 0x1d, 0x09, 0x26,
158
    0xb9, 0xa7, 0x61, 0xba, 0xf8, 0x79, 0xd2, 0x66, 0x57, 0x28, 0xd7, 0x31,
159
    0xb5, 0x0b, 0x27, 0x19, 0x1e, 0x6f, 0x46, 0xfc, 0x54, 0x95, 0xeb, 0x78,
160
    0x01, 0xb6, 0xd9, 0x79, 0x5a, 0x4d, 0x02, 0x81, 0x81, 0x00, 0xd5, 0x8f,
161
    0x16, 0x53, 0x2f, 0x57, 0x93, 0xbf, 0x09, 0x75, 0xbf, 0x63, 0x40, 0x3d,
162
    0x27, 0xfd, 0x23, 0x21, 0xde, 0x9b, 0xe9, 0x73, 0x3f, 0x49, 0x02, 0xd2,
163
    0x38, 0x96, 0xcf, 0xc3, 0xba, 0x92, 0x07, 0x87, 0x52, 0xa9, 0x35, 0xe3,
164
    0x0c, 0xe4, 0x2f, 0x05, 0x7b, 0x37, 0xa5, 0x40, 0x9c, 0x3b, 0x94, 0xf7,
165
    0xad, 0xa0, 0xee, 0x3a, 0xa8, 0xfb, 0x1f, 0x11, 0x1f, 0xd8, 0x9a, 0x80,
166
    0x42, 0x3d, 0x7f, 0xa4, 0xb8, 0x9a, 0xaa, 0xea, 0x72, 0xc1, 0xe3, 0xed,
167
    0x06, 0x60, 0x92, 0x37, 0xf9, 0xba, 0xfb, 0x9e, 0xed, 0x05, 0xa6, 0xd4,
168
    0x72, 0x68, 0x4f, 0x63, 0xfe, 0xd6, 0x10, 0x0d, 0x4f, 0x0a, 0x93, 0xc6,
169
    0xb9, 0xd7, 0xaf, 0xfd, 0xd9, 0x57, 0x7d, 0xcb, 0x75, 0xe8, 0x93, 0x2b,
170
    0xae, 0x4f, 0xea, 0xd7, 0x30, 0x0b, 0x58, 0x44, 0x82, 0x0f, 0x84, 0x5d,
171
    0x62, 0x11, 0x78, 0xea, 0x5f, 0xc5, 0x02, 0x81, 0x81, 0x00, 0x82, 0x0c,
172
    0xc1, 0xe6, 0x0b, 0x72, 0xf1, 0x48, 0x5f, 0xac, 0xbd, 0x98, 0xe5, 0x7d,
173
    0x09, 0xbd, 0x15, 0x95, 0x47, 0x09, 0xa1, 0x6c, 0x03, 0x91, 0xbf, 0x05,
174
    0x70, 0xc1, 0x3e, 0x52, 0x64, 0x99, 0x0e, 0xa7, 0x98, 0x70, 0xfb, 0xf6,
175
    0xeb, 0x9e, 0x25, 0x9d, 0x8e, 0x88, 0x30, 0xf2, 0xf0, 0x22, 0x6c, 0xd0,
176
    0xcc, 0x51, 0x8f, 0x5c, 0x70, 0xc7, 0x37, 0xc4, 0x69, 0xab, 0x1d, 0xfc,
177
    0xed, 0x3a, 0x03, 0xbb, 0xa2, 0xad, 0xb6, 0xea, 0x89, 0x6b, 0x67, 0x4b,
178
    0x96, 0xaa, 0xd9, 0xcc, 0xc8, 0x4b, 0xfa, 0x18, 0x21, 0x08, 0xb2, 0xa3,
179
    0xb9, 0x3e, 0x61, 0x99, 0xdc, 0x5a, 0x97, 0x9c, 0x73, 0x6a, 0xb9, 0xf9,
180
    0x68, 0x03, 0x24, 0x5f, 0x55, 0x77, 0x9c, 0xb4, 0xbe, 0x7a, 0x78, 0x53,
181
    0x68, 0x48, 0x69, 0x53, 0xc8, 0xb1, 0xf5, 0xbf, 0x98, 0x2d, 0x11, 0x1e,
182
    0x98, 0xa8, 0x36, 0x50, 0xa0, 0xb1, 0x02, 0x81, 0x81, 0x00, 0x90, 0x88,
183
    0x30, 0x71, 0xc7, 0xfe, 0x9b, 0x6d, 0x95, 0x37, 0x6d, 0x79, 0xfc, 0x85,
184
    0xe7, 0x44, 0x78, 0xbc, 0x79, 0x6e, 0x47, 0x86, 0xc9, 0xf3, 0xdd, 0xc6,
185
    0xec, 0xa9, 0x94, 0x9f, 0x40, 0xeb, 0x87, 0xd0, 0xdb, 0xee, 0xcd, 0x1b,
186
    0x87, 0x23, 0xff, 0x76, 0xd4, 0x37, 0x8a, 0xcd, 0xb9, 0x6e, 0xd1, 0x98,
187
    0xf6, 0x97, 0x8d, 0xe3, 0x81, 0x6d, 0xc3, 0x4e, 0xd1, 0xa0, 0xc4, 0x9f,
188
    0xbd, 0x34, 0xe5, 0xe8, 0x53, 0x4f, 0xca, 0x10, 0xb5, 0xed, 0xe7, 0x16,
189
    0x09, 0x54, 0xde, 0x60, 0xa7, 0xd1, 0x16, 0x6e, 0x2e, 0xb7, 0xbe, 0x7a,
190
    0xd5, 0x9b, 0x26, 0xef, 0xe4, 0x0e, 0x77, 0xfa, 0xa9, 0xdd, 0xdc, 0xb9,
191
    0x88, 0x19, 0x23, 0x70, 0xc7, 0xe1, 0x60, 0xaf, 0x8c, 0x73, 0x04, 0xf7,
192
    0x71, 0x17, 0x81, 0x36, 0x75, 0xbb, 0x97, 0xd7, 0x75, 0xb6, 0x8e, 0xbc,
193
    0xac, 0x9c, 0x6a, 0x9b, 0x24, 0x89, 0x02, 0x81, 0x80, 0x5a, 0x2b, 0xc7,
194
    0x6b, 0x8c, 0x65, 0xdb, 0x04, 0x73, 0xab, 0x25, 0xe1, 0x5b, 0xbc, 0x3c,
195
    0xcf, 0x5a, 0x3c, 0x04, 0xae, 0x97, 0x2e, 0xfd, 0xa4, 0x97, 0x1f, 0x05,
196
    0x17, 0x27, 0xac, 0x7c, 0x30, 0x85, 0xb4, 0x82, 0x3f, 0x5b, 0xb7, 0x94,
197
    0x3b, 0x7f, 0x6c, 0x0c, 0xc7, 0x16, 0xc6, 0xa0, 0xbd, 0x80, 0xb0, 0x81,
198
    0xde, 0xa0, 0x23, 0xa6, 0xf6, 0x75, 0x33, 0x51, 0x35, 0xa2, 0x75, 0x55,
199
    0x70, 0x4d, 0x42, 0xbb, 0xcf, 0x54, 0xe4, 0xdb, 0x2d, 0x88, 0xa0, 0x7a,
200
    0xf2, 0x17, 0xa7, 0xdd, 0x13, 0x44, 0x9f, 0x5f, 0x6b, 0x2c, 0x42, 0x42,
201
    0x8b, 0x13, 0x4d, 0xf9, 0x5b, 0xf8, 0x33, 0x42, 0xd9, 0x9e, 0x50, 0x1c,
202
    0x7c, 0xbc, 0xfa, 0x62, 0x85, 0x0b, 0xcf, 0x99, 0xda, 0x9e, 0x04, 0x90,
203
    0xb2, 0xc6, 0xb2, 0x0a, 0x2a, 0x7c, 0x6d, 0x6a, 0x40, 0xfc, 0xf5, 0x50,
204
    0x98, 0x46, 0x89, 0x82, 0x40,
205
};
206
207
struct GlobalState {
208
2
  GlobalState() {
209
2
    const uint8_t *bufp = kRSAPrivateKeyDER;
210
2
    RSA *privkey = d2i_RSAPrivateKey(NULL, &bufp, sizeof(kRSAPrivateKeyDER));
211
2
    assert(privkey != nullptr);
212
213
2
    pkey_.reset(EVP_PKEY_new());
214
2
    EVP_PKEY_assign_RSA(pkey_.get(), privkey);
215
216
2
    bufp = kCertificateDER;
217
2
    cert_.reset(d2i_X509(NULL, &bufp, sizeof(kCertificateDER)));
218
2
    assert(cert_.get() != nullptr);
219
220
2
    certs_.reset(sk_X509_new_null());
221
2
    PushToStack(certs_.get(), UpRef(cert_));
222
2
  }
223
224
  UniquePtr<EVP_PKEY> pkey_;
225
  UniquePtr<X509> cert_;
226
  UniquePtr<STACK_OF(X509)> certs_;
227
};
228
229
static GlobalState g_state;
230
231
43.5k
static bool GetString(std::string *out, CBS *cbs) {
232
43.5k
  CBS str;
233
43.5k
  if (!CBS_get_u8_length_prefixed(cbs, &str)) {
234
967
    return false;
235
967
  }
236
237
42.5k
  *out = BytesAsStringView(str);
238
42.5k
  return true;
239
43.5k
}
240
241
template <typename T>
242
82.2k
static bool GetVector(std::vector<T> *out, CBS *cbs) {
243
82.2k
  static_assert(
244
82.2k
      std::is_standard_layout_v<T> && std::is_trivially_copyable_v<T>,
245
82.2k
      "GetVector may only be called on standard layout, trivially copyable "
246
82.2k
      "types");
247
248
82.2k
  CBS child;
249
82.2k
  if (!CBS_get_u8_length_prefixed(cbs, &child)) {
250
1.72k
    return false;
251
1.72k
  }
252
253
80.4k
  size_t num = CBS_len(&child) / sizeof(T);
254
80.4k
  out->resize(num);
255
80.4k
  out->shrink_to_fit();  // Ensure ASan notices out-of-bounds reads.
256
80.4k
  OPENSSL_memcpy(out->data(), CBS_data(&child), num * sizeof(T));
257
80.4k
  return true;
258
82.2k
}
ssl_ctx_api.cc:bool GetVector<unsigned char>(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >*, cbs_st*)
Line
Count
Source
242
35.0k
static bool GetVector(std::vector<T> *out, CBS *cbs) {
243
35.0k
  static_assert(
244
35.0k
      std::is_standard_layout_v<T> && std::is_trivially_copyable_v<T>,
245
35.0k
      "GetVector may only be called on standard layout, trivially copyable "
246
35.0k
      "types");
247
248
35.0k
  CBS child;
249
35.0k
  if (!CBS_get_u8_length_prefixed(cbs, &child)) {
250
994
    return false;
251
994
  }
252
253
34.0k
  size_t num = CBS_len(&child) / sizeof(T);
254
34.0k
  out->resize(num);
255
34.0k
  out->shrink_to_fit();  // Ensure ASan notices out-of-bounds reads.
256
34.0k
  OPENSSL_memcpy(out->data(), CBS_data(&child), num * sizeof(T));
257
34.0k
  return true;
258
35.0k
}
ssl_ctx_api.cc:bool GetVector<unsigned short>(std::__1::vector<unsigned short, std::__1::allocator<unsigned short> >*, cbs_st*)
Line
Count
Source
242
29.7k
static bool GetVector(std::vector<T> *out, CBS *cbs) {
243
29.7k
  static_assert(
244
29.7k
      std::is_standard_layout_v<T> && std::is_trivially_copyable_v<T>,
245
29.7k
      "GetVector may only be called on standard layout, trivially copyable "
246
29.7k
      "types");
247
248
29.7k
  CBS child;
249
29.7k
  if (!CBS_get_u8_length_prefixed(cbs, &child)) {
250
317
    return false;
251
317
  }
252
253
29.4k
  size_t num = CBS_len(&child) / sizeof(T);
254
29.4k
  out->resize(num);
255
29.4k
  out->shrink_to_fit();  // Ensure ASan notices out-of-bounds reads.
256
29.4k
  OPENSSL_memcpy(out->data(), CBS_data(&child), num * sizeof(T));
257
29.4k
  return true;
258
29.7k
}
ssl_ctx_api.cc:bool GetVector<int>(std::__1::vector<int, std::__1::allocator<int> >*, cbs_st*)
Line
Count
Source
242
17.3k
static bool GetVector(std::vector<T> *out, CBS *cbs) {
243
17.3k
  static_assert(
244
17.3k
      std::is_standard_layout_v<T> && std::is_trivially_copyable_v<T>,
245
17.3k
      "GetVector may only be called on standard layout, trivially copyable "
246
17.3k
      "types");
247
248
17.3k
  CBS child;
249
17.3k
  if (!CBS_get_u8_length_prefixed(cbs, &child)) {
250
417
    return false;
251
417
  }
252
253
16.9k
  size_t num = CBS_len(&child) / sizeof(T);
254
16.9k
  out->resize(num);
255
16.9k
  out->shrink_to_fit();  // Ensure ASan notices out-of-bounds reads.
256
16.9k
  OPENSSL_memcpy(out->data(), CBS_data(&child), num * sizeof(T));
257
16.9k
  return true;
258
17.3k
}
259
260
4.97k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) {
261
4.97k
  constexpr size_t kMaxExpensiveAPIs = 100;
262
4.97k
  constexpr size_t kMaxAPIs = 10000;
263
4.97k
  unsigned expensive_api_count = 0;
264
265
4.97k
  const std::function<void(SSL_CTX *, CBS *)> kAPIs[] = {
266
74.4k
      [](SSL_CTX *ctx, CBS *cbs) {
267
74.4k
        uint8_t b;
268
74.4k
        if (!CBS_get_u8(cbs, &b)) {
269
41
          return;
270
41
        }
271
74.4k
        SSL_CTX_set_quiet_shutdown(ctx, b);
272
74.4k
      },
273
20.2k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_quiet_shutdown(ctx); },
274
20.0k
      [](SSL_CTX *ctx, CBS *cbs) {
275
20.0k
        uint16_t version;
276
20.0k
        if (!CBS_get_u16(cbs, &version)) {
277
30
          return;
278
30
        }
279
20.0k
        SSL_CTX_set_min_proto_version(ctx, version);
280
20.0k
      },
281
6.32k
      [](SSL_CTX *ctx, CBS *cbs) {
282
6.32k
        uint16_t version;
283
6.32k
        if (!CBS_get_u16(cbs, &version)) {
284
30
          return;
285
30
        }
286
6.29k
        SSL_CTX_set_max_proto_version(ctx, version);
287
6.29k
      },
288
7.46k
      [](SSL_CTX *ctx, CBS *cbs) {
289
7.46k
        uint32_t options;
290
7.46k
        if (!CBS_get_u32(cbs, &options)) {
291
50
          return;
292
50
        }
293
7.41k
        SSL_CTX_set_options(ctx, options);
294
7.41k
      },
295
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
296
2.05k
        uint32_t options;
297
2.05k
        if (!CBS_get_u32(cbs, &options)) {
298
32
          return;
299
32
        }
300
2.02k
        SSL_CTX_clear_options(ctx, options);
301
2.02k
      },
302
4.97k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_options(ctx); },
303
11.3k
      [](SSL_CTX *ctx, CBS *cbs) {
304
11.3k
        uint32_t mode;
305
11.3k
        if (!CBS_get_u32(cbs, &mode)) {
306
41
          return;
307
41
        }
308
11.2k
        SSL_CTX_set_mode(ctx, mode);
309
11.2k
      },
310
11.2k
      [](SSL_CTX *ctx, CBS *cbs) {
311
11.2k
        uint32_t mode;
312
11.2k
        if (!CBS_get_u32(cbs, &mode)) {
313
41
          return;
314
41
        }
315
11.2k
        SSL_CTX_clear_mode(ctx, mode);
316
11.2k
      },
317
4.97k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_mode(ctx); },
318
7.82k
      [](SSL_CTX *ctx, CBS *cbs) {
319
7.82k
        SSL_CTX_use_certificate(ctx, g_state.cert_.get());
320
7.82k
      },
321
6.02k
      [](SSL_CTX *ctx, CBS *cbs) {
322
6.02k
        SSL_CTX_use_PrivateKey(ctx, g_state.pkey_.get());
323
6.02k
      },
324
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
325
2.72k
        SSL_CTX_set1_chain(ctx, g_state.certs_.get());
326
2.72k
      },
327
32.1k
      [&](SSL_CTX *ctx, CBS *cbs) {
328
        // Avoid an unbounded certificate chain.
329
32.1k
        if (++expensive_api_count >= kMaxExpensiveAPIs) {
330
23.1k
          return;
331
23.1k
        }
332
333
9.01k
        SSL_CTX_add1_chain_cert(ctx, g_state.cert_.get());
334
9.01k
      },
335
4.98k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_clear_chain_certs(ctx); },
336
56.0k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_clear_extra_chain_certs(ctx); },
337
4.97k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_check_private_key(ctx); },
338
7.88k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get0_certificate(ctx); },
339
4.99k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get0_privatekey(ctx); },
340
10.3k
      [](SSL_CTX *ctx, CBS *cbs) {
341
10.3k
        STACK_OF(X509) * chains;
342
10.3k
        SSL_CTX_get0_chain_certs(ctx, &chains);
343
10.3k
      },
344
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
345
2.77k
        std::vector<uint8_t> sct_data;
346
2.77k
        if (!GetVector(&sct_data, cbs)) {
347
99
          return;
348
99
        }
349
2.67k
        SSL_CTX_set_signed_cert_timestamp_list(ctx, sct_data.data(),
350
2.67k
                                               sct_data.size());
351
2.67k
      },
352
12.7k
      [](SSL_CTX *ctx, CBS *cbs) {
353
12.7k
        std::vector<uint8_t> ocsp_data;
354
12.7k
        if (!GetVector(&ocsp_data, cbs)) {
355
101
          return;
356
101
        }
357
12.6k
        SSL_CTX_set_ocsp_response(ctx, ocsp_data.data(), ocsp_data.size());
358
12.6k
      },
359
23.1k
      [](SSL_CTX *ctx, CBS *cbs) {
360
23.1k
        std::vector<uint16_t> algs;
361
23.1k
        if (!GetVector(&algs, cbs)) {
362
91
          return;
363
91
        }
364
23.0k
        SSL_CTX_set_signing_algorithm_prefs(ctx, algs.data(), algs.size());
365
23.0k
      },
366
9.22k
      [](SSL_CTX *ctx, CBS *cbs) {
367
9.22k
        std::string ciphers;
368
9.22k
        if (!GetString(&ciphers, cbs)) {
369
137
          return;
370
137
        }
371
9.08k
        SSL_CTX_set_strict_cipher_list(ctx, ciphers.c_str());
372
9.08k
      },
373
16.1k
      [](SSL_CTX *ctx, CBS *cbs) {
374
16.1k
        std::string ciphers;
375
16.1k
        if (!GetString(&ciphers, cbs)) {
376
109
          return;
377
109
        }
378
16.0k
        SSL_CTX_set_cipher_list(ctx, ciphers.c_str());
379
16.0k
      },
380
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
381
1.94k
        std::vector<uint16_t> algs;
382
1.94k
        if (!GetVector(&algs, cbs)) {
383
77
          return;
384
77
        }
385
1.86k
        SSL_CTX_set_verify_algorithm_prefs(ctx, algs.data(), algs.size());
386
1.86k
      },
387
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
388
2.78k
        std::vector<uint8_t> id_ctx;
389
2.78k
        if (!GetVector(&id_ctx, cbs)) {
390
298
          return;
391
298
        }
392
2.49k
        SSL_CTX_set_session_id_context(ctx, id_ctx.data(), id_ctx.size());
393
2.49k
      },
394
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
395
2.55k
        uint32_t size;
396
2.55k
        if (!CBS_get_u32(cbs, &size)) {
397
33
          return;
398
33
        }
399
2.51k
        SSL_CTX_sess_set_cache_size(ctx, size);
400
2.51k
      },
401
8.93k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_sess_get_cache_size(ctx); },
402
4.97k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_sess_number(ctx); },
403
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
404
3.50k
        uint32_t time;
405
3.50k
        if (!CBS_get_u32(cbs, &time)) {
406
41
          return;
407
41
        }
408
3.46k
        SSL_CTX_flush_sessions(ctx, time);
409
3.46k
      },
410
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
411
1.71k
        std::vector<uint8_t> keys;
412
1.71k
        if (!GetVector(&keys, cbs)) {
413
221
          return;
414
221
        }
415
1.49k
        SSL_CTX_set_tlsext_ticket_keys(ctx, keys.data(), keys.size());
416
1.49k
      },
417
8.31k
      [](SSL_CTX *ctx, CBS *cbs) {
418
8.31k
        std::vector<int> groups;
419
8.31k
        if (!GetVector(&groups, cbs)) {
420
177
          return;
421
177
        }
422
8.13k
        SSL_CTX_set1_groups(ctx, groups.data(), groups.size());
423
8.13k
      },
424
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
425
4.68k
        std::vector<uint16_t> groups;
426
4.68k
        if (!GetVector(&groups, cbs)) {
427
149
          return;
428
149
        }
429
4.53k
        SSL_CTX_set1_group_ids(ctx, groups.data(), groups.size());
430
4.53k
      },
431
5.64k
      [](SSL_CTX *ctx, CBS *cbs) {
432
5.64k
        std::string groups;
433
5.64k
        if (!GetString(&groups, cbs)) {
434
381
          return;
435
381
        }
436
5.26k
        SSL_CTX_set1_groups_list(ctx, groups.c_str());
437
5.26k
      },
438
5.62k
      [](SSL_CTX *ctx, CBS *cbs) {
439
5.62k
        SSL_CTX_enable_signed_cert_timestamps(ctx);
440
5.62k
      },
441
4.97k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_enable_ocsp_stapling(ctx); },
442
14.6k
      [&](SSL_CTX *ctx, CBS *cbs) {
443
        // Avoid an unbounded client CA list.
444
14.6k
        if (++expensive_api_count >= kMaxExpensiveAPIs) {
445
11.6k
          return;
446
11.6k
        }
447
448
3.07k
        SSL_CTX_add_client_CA(ctx, g_state.cert_.get());
449
3.07k
      },
450
15.0k
      [](SSL_CTX *ctx, CBS *cbs) {
451
15.0k
        std::vector<uint8_t> protos;
452
15.0k
        if (!GetVector(&protos, cbs)) {
453
275
          return;
454
275
        }
455
14.7k
        SSL_CTX_set_alpn_protos(ctx, protos.data(), protos.size());
456
14.7k
      },
457
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
458
3.64k
        std::string profiles;
459
3.64k
        if (!GetString(&profiles, cbs)) {
460
96
          return;
461
96
        }
462
3.54k
        SSL_CTX_set_srtp_profiles(ctx, profiles.c_str());
463
3.54k
      },
464
4.97k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_max_cert_list(ctx); },
465
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
466
2.01k
        uint32_t size;
467
2.01k
        if (!CBS_get_u32(cbs, &size)) {
468
30
          return;
469
30
        }
470
1.98k
        SSL_CTX_set_max_cert_list(ctx, size);
471
1.98k
      },
472
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
473
2.96k
        uint32_t size;
474
2.96k
        if (!CBS_get_u32(cbs, &size)) {
475
33
          return;
476
33
        }
477
2.93k
        SSL_CTX_set_max_send_fragment(ctx, size);
478
2.93k
      },
479
15.7k
      [](SSL_CTX *ctx, CBS *cbs) {
480
15.7k
        uint8_t b;
481
15.7k
        if (!CBS_get_u8(cbs, &b)) {
482
23
          return;
483
23
        }
484
15.7k
        SSL_CTX_set_retain_only_sha256_of_client_certs(ctx, b);
485
15.7k
      },
486
4.97k
      [](SSL_CTX *ctx, CBS *cbs) {
487
1.17k
        uint8_t b;
488
1.17k
        if (!CBS_get_u8(cbs, &b)) {
489
9
          return;
490
9
        }
491
1.16k
        SSL_CTX_set_grease_enabled(ctx, b);
492
1.16k
      },
493
9.08k
      [](SSL_CTX *ctx, CBS *cbs) {
494
9.08k
        std::vector<int> sigalgs;
495
9.08k
        if (!GetVector(&sigalgs, cbs)) {
496
240
          return;
497
240
        }
498
8.84k
        SSL_CTX_set1_sigalgs(ctx, sigalgs.data(), sigalgs.size());
499
8.84k
      },
500
8.92k
      [](SSL_CTX *ctx, CBS *cbs) {
501
8.92k
        std::string sigalgs;
502
8.92k
        if (!GetString(&sigalgs, cbs)) {
503
244
          return;
504
244
        }
505
8.68k
        SSL_CTX_set1_sigalgs_list(ctx, sigalgs.c_str());
506
8.68k
      },
507
20.8k
      [](SSL_CTX *ctx, CBS *cbs) {
508
20.8k
        UniquePtr<SSL_ECH_KEYS> keys(SSL_ECH_KEYS_new());
509
20.8k
        if (keys == nullptr) {
510
0
          return;
511
0
        }
512
20.8k
        uint8_t is_retry_config;
513
20.8k
        CBS ech_config, private_key;
514
20.8k
        if (!CBS_get_u8(cbs, &is_retry_config) ||
515
20.8k
            !CBS_get_u16_length_prefixed(cbs, &ech_config) ||
516
15.3k
            !CBS_get_u16_length_prefixed(cbs, &private_key)) {
517
6.12k
          return;
518
6.12k
        }
519
14.7k
        ScopedEVP_HPKE_KEY key;
520
14.7k
        if (!EVP_HPKE_KEY_init(key.get(), EVP_hpke_x25519_hkdf_sha256(),
521
14.7k
                               CBS_data(&private_key), CBS_len(&private_key)) ||
522
13.8k
            !SSL_ECH_KEYS_add(keys.get(), is_retry_config,
523
13.8k
                              CBS_data(&ech_config), CBS_len(&ech_config),
524
13.8k
                              key.get()) ||
525
14.7k
            !SSL_CTX_set1_ech_keys(ctx, keys.get())) {
526
14.7k
          return;
527
14.7k
        }
528
14.7k
      },
529
4.97k
  };
530
531
4.97k
  UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
532
533
  // If the number of functions exceeds this limit then the code needs to do
534
  // more than sample a single uint8_t to pick the function.
535
4.97k
  static_assert(std::size(kAPIs) < 256, "kAPIs too large");
536
537
4.97k
  CBS cbs;
538
4.97k
  CBS_init(&cbs, buf, len);
539
540
514k
  for (unsigned i = 0; i < kMaxAPIs; i++) {
541
514k
    uint8_t index;
542
514k
    if (!CBS_get_u8(&cbs, &index)) {
543
4.95k
      break;
544
4.95k
    }
545
546
509k
    kAPIs[index % std::size(kAPIs)](ctx.get(), &cbs);
547
509k
  }
548
549
4.97k
  UniquePtr<SSL> ssl(SSL_new(ctx.get()));
550
4.97k
  ERR_clear_error();
551
552
4.97k
  return 0;
553
4.97k
}