Coverage Report

Created: 2026-10-27 07:01

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
47.8k
static bool GetString(std::string *out, CBS *cbs) {
232
47.8k
  CBS str;
233
47.8k
  if (!CBS_get_u8_length_prefixed(cbs, &str)) {
234
1.10k
    return false;
235
1.10k
  }
236
237
46.7k
  *out = BytesAsStringView(str);
238
46.7k
  return true;
239
47.8k
}
240
241
template <typename T>
242
66.5k
static bool GetVector(std::vector<T> *out, CBS *cbs) {
243
66.5k
  static_assert(
244
66.5k
      std::is_standard_layout_v<T> && std::is_trivially_copyable_v<T>,
245
66.5k
      "GetVector may only be called on standard layout, trivially copyable "
246
66.5k
      "types");
247
248
66.5k
  CBS child;
249
66.5k
  if (!CBS_get_u8_length_prefixed(cbs, &child)) {
250
1.58k
    return false;
251
1.58k
  }
252
253
65.0k
  size_t num = CBS_len(&child) / sizeof(T);
254
65.0k
  out->resize(num);
255
65.0k
  out->shrink_to_fit();  // Ensure ASan notices out-of-bounds reads.
256
65.0k
  OPENSSL_memcpy(out->data(), CBS_data(&child), num * sizeof(T));
257
65.0k
  return true;
258
66.5k
}
ssl_ctx_api.cc:bool GetVector<unsigned char>(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >*, cbs_st*)
Line
Count
Source
242
43.1k
static bool GetVector(std::vector<T> *out, CBS *cbs) {
243
43.1k
  static_assert(
244
43.1k
      std::is_standard_layout_v<T> && std::is_trivially_copyable_v<T>,
245
43.1k
      "GetVector may only be called on standard layout, trivially copyable "
246
43.1k
      "types");
247
248
43.1k
  CBS child;
249
43.1k
  if (!CBS_get_u8_length_prefixed(cbs, &child)) {
250
906
    return false;
251
906
  }
252
253
42.2k
  size_t num = CBS_len(&child) / sizeof(T);
254
42.2k
  out->resize(num);
255
42.2k
  out->shrink_to_fit();  // Ensure ASan notices out-of-bounds reads.
256
42.2k
  OPENSSL_memcpy(out->data(), CBS_data(&child), num * sizeof(T));
257
42.2k
  return true;
258
43.1k
}
ssl_ctx_api.cc:bool GetVector<unsigned short>(std::__1::vector<unsigned short, std::__1::allocator<unsigned short> >*, cbs_st*)
Line
Count
Source
242
10.2k
static bool GetVector(std::vector<T> *out, CBS *cbs) {
243
10.2k
  static_assert(
244
10.2k
      std::is_standard_layout_v<T> && std::is_trivially_copyable_v<T>,
245
10.2k
      "GetVector may only be called on standard layout, trivially copyable "
246
10.2k
      "types");
247
248
10.2k
  CBS child;
249
10.2k
  if (!CBS_get_u8_length_prefixed(cbs, &child)) {
250
282
    return false;
251
282
  }
252
253
9.99k
  size_t num = CBS_len(&child) / sizeof(T);
254
9.99k
  out->resize(num);
255
9.99k
  out->shrink_to_fit();  // Ensure ASan notices out-of-bounds reads.
256
9.99k
  OPENSSL_memcpy(out->data(), CBS_data(&child), num * sizeof(T));
257
9.99k
  return true;
258
10.2k
}
ssl_ctx_api.cc:bool GetVector<int>(std::__1::vector<int, std::__1::allocator<int> >*, cbs_st*)
Line
Count
Source
242
13.1k
static bool GetVector(std::vector<T> *out, CBS *cbs) {
243
13.1k
  static_assert(
244
13.1k
      std::is_standard_layout_v<T> && std::is_trivially_copyable_v<T>,
245
13.1k
      "GetVector may only be called on standard layout, trivially copyable "
246
13.1k
      "types");
247
248
13.1k
  CBS child;
249
13.1k
  if (!CBS_get_u8_length_prefixed(cbs, &child)) {
250
394
    return false;
251
394
  }
252
253
12.7k
  size_t num = CBS_len(&child) / sizeof(T);
254
12.7k
  out->resize(num);
255
12.7k
  out->shrink_to_fit();  // Ensure ASan notices out-of-bounds reads.
256
12.7k
  OPENSSL_memcpy(out->data(), CBS_data(&child), num * sizeof(T));
257
12.7k
  return true;
258
13.1k
}
259
260
5.13k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) {
261
5.13k
  constexpr size_t kMaxExpensiveAPIs = 100;
262
5.13k
  constexpr size_t kMaxAPIs = 10000;
263
5.13k
  unsigned expensive_api_count = 0;
264
265
5.13k
  const std::function<void(SSL_CTX *, CBS *)> kAPIs[] = {
266
93.1k
      [](SSL_CTX *ctx, CBS *cbs) {
267
93.1k
        uint8_t b;
268
93.1k
        if (!CBS_get_u8(cbs, &b)) {
269
45
          return;
270
45
        }
271
93.0k
        SSL_CTX_set_quiet_shutdown(ctx, b);
272
93.0k
      },
273
7.46k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_quiet_shutdown(ctx); },
274
22.3k
      [](SSL_CTX *ctx, CBS *cbs) {
275
22.3k
        uint16_t version;
276
22.3k
        if (!CBS_get_u16(cbs, &version)) {
277
23
          return;
278
23
        }
279
22.3k
        SSL_CTX_set_min_proto_version(ctx, version);
280
22.3k
      },
281
8.19k
      [](SSL_CTX *ctx, CBS *cbs) {
282
8.19k
        uint16_t version;
283
8.19k
        if (!CBS_get_u16(cbs, &version)) {
284
39
          return;
285
39
        }
286
8.15k
        SSL_CTX_set_max_proto_version(ctx, version);
287
8.15k
      },
288
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
289
4.77k
        uint32_t options;
290
4.77k
        if (!CBS_get_u32(cbs, &options)) {
291
36
          return;
292
36
        }
293
4.74k
        SSL_CTX_set_options(ctx, options);
294
4.74k
      },
295
10.9k
      [](SSL_CTX *ctx, CBS *cbs) {
296
10.9k
        uint32_t options;
297
10.9k
        if (!CBS_get_u32(cbs, &options)) {
298
33
          return;
299
33
        }
300
10.9k
        SSL_CTX_clear_options(ctx, options);
301
10.9k
      },
302
5.13k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_options(ctx); },
303
9.42k
      [](SSL_CTX *ctx, CBS *cbs) {
304
9.42k
        uint32_t mode;
305
9.42k
        if (!CBS_get_u32(cbs, &mode)) {
306
35
          return;
307
35
        }
308
9.38k
        SSL_CTX_set_mode(ctx, mode);
309
9.38k
      },
310
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
311
3.00k
        uint32_t mode;
312
3.00k
        if (!CBS_get_u32(cbs, &mode)) {
313
34
          return;
314
34
        }
315
2.97k
        SSL_CTX_clear_mode(ctx, mode);
316
2.97k
      },
317
6.57k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_mode(ctx); },
318
9.93k
      [](SSL_CTX *ctx, CBS *cbs) {
319
9.93k
        SSL_CTX_use_certificate(ctx, g_state.cert_.get());
320
9.93k
      },
321
7.69k
      [](SSL_CTX *ctx, CBS *cbs) {
322
7.69k
        SSL_CTX_use_PrivateKey(ctx, g_state.pkey_.get());
323
7.69k
      },
324
5.74k
      [](SSL_CTX *ctx, CBS *cbs) {
325
5.74k
        SSL_CTX_set1_chain(ctx, g_state.certs_.get());
326
5.74k
      },
327
31.1k
      [&](SSL_CTX *ctx, CBS *cbs) {
328
        // Avoid an unbounded certificate chain.
329
31.1k
        if (++expensive_api_count >= kMaxExpensiveAPIs) {
330
21.9k
          return;
331
21.9k
        }
332
333
9.16k
        SSL_CTX_add1_chain_cert(ctx, g_state.cert_.get());
334
9.16k
      },
335
5.13k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_clear_chain_certs(ctx); },
336
58.4k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_clear_extra_chain_certs(ctx); },
337
5.91k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_check_private_key(ctx); },
338
7.00k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get0_certificate(ctx); },
339
5.13k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get0_privatekey(ctx); },
340
11.6k
      [](SSL_CTX *ctx, CBS *cbs) {
341
11.6k
        STACK_OF(X509) * chains;
342
11.6k
        SSL_CTX_get0_chain_certs(ctx, &chains);
343
11.6k
      },
344
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
345
3.07k
        std::vector<uint8_t> sct_data;
346
3.07k
        if (!GetVector(&sct_data, cbs)) {
347
84
          return;
348
84
        }
349
2.98k
        SSL_CTX_set_signed_cert_timestamp_list(ctx, sct_data.data(),
350
2.98k
                                               sct_data.size());
351
2.98k
      },
352
22.5k
      [](SSL_CTX *ctx, CBS *cbs) {
353
22.5k
        std::vector<uint8_t> ocsp_data;
354
22.5k
        if (!GetVector(&ocsp_data, cbs)) {
355
95
          return;
356
95
        }
357
22.4k
        SSL_CTX_set_ocsp_response(ctx, ocsp_data.data(), ocsp_data.size());
358
22.4k
      },
359
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
360
2.80k
        std::vector<uint16_t> algs;
361
2.80k
        if (!GetVector(&algs, cbs)) {
362
89
          return;
363
89
        }
364
2.71k
        SSL_CTX_set_signing_algorithm_prefs(ctx, algs.data(), algs.size());
365
2.71k
      },
366
11.1k
      [](SSL_CTX *ctx, CBS *cbs) {
367
11.1k
        std::string ciphers;
368
11.1k
        if (!GetString(&ciphers, cbs)) {
369
105
          return;
370
105
        }
371
11.0k
        SSL_CTX_set_strict_cipher_list(ctx, ciphers.c_str());
372
11.0k
      },
373
16.3k
      [](SSL_CTX *ctx, CBS *cbs) {
374
16.3k
        std::string ciphers;
375
16.3k
        if (!GetString(&ciphers, cbs)) {
376
197
          return;
377
197
        }
378
16.1k
        SSL_CTX_set_cipher_list(ctx, ciphers.c_str());
379
16.1k
      },
380
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
381
2.61k
        std::vector<uint16_t> algs;
382
2.61k
        if (!GetVector(&algs, cbs)) {
383
88
          return;
384
88
        }
385
2.52k
        SSL_CTX_set_verify_algorithm_prefs(ctx, algs.data(), algs.size());
386
2.52k
      },
387
10.3k
      [](SSL_CTX *ctx, CBS *cbs) {
388
10.3k
        std::vector<uint8_t> id_ctx;
389
10.3k
        if (!GetVector(&id_ctx, cbs)) {
390
98
          return;
391
98
        }
392
10.2k
        SSL_CTX_set_session_id_context(ctx, id_ctx.data(), id_ctx.size());
393
10.2k
      },
394
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
395
2.60k
        uint32_t size;
396
2.60k
        if (!CBS_get_u32(cbs, &size)) {
397
34
          return;
398
34
        }
399
2.57k
        SSL_CTX_sess_set_cache_size(ctx, size);
400
2.57k
      },
401
9.33k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_sess_get_cache_size(ctx); },
402
5.13k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_sess_number(ctx); },
403
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
404
3.29k
        uint32_t time;
405
3.29k
        if (!CBS_get_u32(cbs, &time)) {
406
34
          return;
407
34
        }
408
3.26k
        SSL_CTX_flush_sessions(ctx, time);
409
3.26k
      },
410
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
411
2.53k
        std::vector<uint8_t> keys;
412
2.53k
        if (!GetVector(&keys, cbs)) {
413
346
          return;
414
346
        }
415
2.18k
        SSL_CTX_set_tlsext_ticket_keys(ctx, keys.data(), keys.size());
416
2.18k
      },
417
9.66k
      [](SSL_CTX *ctx, CBS *cbs) {
418
9.66k
        std::vector<int> groups;
419
9.66k
        if (!GetVector(&groups, cbs)) {
420
130
          return;
421
130
        }
422
9.53k
        SSL_CTX_set1_groups(ctx, groups.data(), groups.size());
423
9.53k
      },
424
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
425
4.85k
        std::vector<uint16_t> groups;
426
4.85k
        if (!GetVector(&groups, cbs)) {
427
105
          return;
428
105
        }
429
4.75k
        SSL_CTX_set1_group_ids(ctx, groups.data(), groups.size());
430
4.75k
      },
431
6.05k
      [](SSL_CTX *ctx, CBS *cbs) {
432
6.05k
        std::string groups;
433
6.05k
        if (!GetString(&groups, cbs)) {
434
364
          return;
435
364
        }
436
5.69k
        SSL_CTX_set1_groups_list(ctx, groups.c_str());
437
5.69k
      },
438
5.55k
      [](SSL_CTX *ctx, CBS *cbs) {
439
5.55k
        SSL_CTX_enable_signed_cert_timestamps(ctx);
440
5.55k
      },
441
5.13k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_enable_ocsp_stapling(ctx); },
442
20.3k
      [&](SSL_CTX *ctx, CBS *cbs) {
443
        // Avoid an unbounded client CA list.
444
20.3k
        if (++expensive_api_count >= kMaxExpensiveAPIs) {
445
17.0k
          return;
446
17.0k
        }
447
448
3.27k
        SSL_CTX_add_client_CA(ctx, g_state.cert_.get());
449
3.27k
      },
450
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
451
4.69k
        std::vector<uint8_t> protos;
452
4.69k
        if (!GetVector(&protos, cbs)) {
453
283
          return;
454
283
        }
455
4.41k
        SSL_CTX_set_alpn_protos(ctx, protos.data(), protos.size());
456
4.41k
      },
457
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
458
3.45k
        std::string profiles;
459
3.45k
        if (!GetString(&profiles, cbs)) {
460
119
          return;
461
119
        }
462
3.33k
        SSL_CTX_set_srtp_profiles(ctx, profiles.c_str());
463
3.33k
      },
464
5.13k
      [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_max_cert_list(ctx); },
465
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
466
1.89k
        uint32_t size;
467
1.89k
        if (!CBS_get_u32(cbs, &size)) {
468
30
          return;
469
30
        }
470
1.86k
        SSL_CTX_set_max_cert_list(ctx, size);
471
1.86k
      },
472
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
473
2.89k
        uint32_t size;
474
2.89k
        if (!CBS_get_u32(cbs, &size)) {
475
28
          return;
476
28
        }
477
2.87k
        SSL_CTX_set_max_send_fragment(ctx, size);
478
2.87k
      },
479
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
480
3.28k
        uint8_t b;
481
3.28k
        if (!CBS_get_u8(cbs, &b)) {
482
15
          return;
483
15
        }
484
3.26k
        SSL_CTX_set_retain_only_sha256_of_client_certs(ctx, b);
485
3.26k
      },
486
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
487
1.33k
        uint8_t b;
488
1.33k
        if (!CBS_get_u8(cbs, &b)) {
489
10
          return;
490
10
        }
491
1.32k
        SSL_CTX_set_grease_enabled(ctx, b);
492
1.32k
      },
493
5.13k
      [](SSL_CTX *ctx, CBS *cbs) {
494
3.46k
        std::vector<int> sigalgs;
495
3.46k
        if (!GetVector(&sigalgs, cbs)) {
496
264
          return;
497
264
        }
498
3.20k
        SSL_CTX_set1_sigalgs(ctx, sigalgs.data(), sigalgs.size());
499
3.20k
      },
500
10.9k
      [](SSL_CTX *ctx, CBS *cbs) {
501
10.9k
        std::string sigalgs;
502
10.9k
        if (!GetString(&sigalgs, cbs)) {
503
317
          return;
504
317
        }
505
10.5k
        SSL_CTX_set1_sigalgs_list(ctx, sigalgs.c_str());
506
10.5k
      },
507
15.0k
      [](SSL_CTX *ctx, CBS *cbs) {
508
15.0k
        UniquePtr<SSL_ECH_KEYS> keys(SSL_ECH_KEYS_new());
509
15.0k
        if (keys == nullptr) {
510
0
          return;
511
0
        }
512
15.0k
        uint8_t is_retry_config;
513
15.0k
        CBS ech_config, private_key;
514
15.0k
        if (!CBS_get_u8(cbs, &is_retry_config) ||
515
15.0k
            !CBS_get_u16_length_prefixed(cbs, &ech_config) ||
516
14.1k
            !CBS_get_u16_length_prefixed(cbs, &private_key)) {
517
1.20k
          return;
518
1.20k
        }
519
13.8k
        ScopedEVP_HPKE_KEY key;
520
13.8k
        if (!EVP_HPKE_KEY_init(key.get(), EVP_hpke_x25519_hkdf_sha256(),
521
13.8k
                               CBS_data(&private_key), CBS_len(&private_key)) ||
522
13.0k
            !SSL_ECH_KEYS_add(keys.get(), is_retry_config,
523
13.0k
                              CBS_data(&ech_config), CBS_len(&ech_config),
524
13.0k
                              key.get()) ||
525
13.8k
            !SSL_CTX_set1_ech_keys(ctx, keys.get())) {
526
13.8k
          return;
527
13.8k
        }
528
13.8k
      },
529
5.13k
  };
530
531
5.13k
  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
5.13k
  static_assert(std::size(kAPIs) < 256, "kAPIs too large");
536
537
5.13k
  CBS cbs;
538
5.13k
  CBS_init(&cbs, buf, len);
539
540
507k
  for (unsigned i = 0; i < kMaxAPIs; i++) {
541
507k
    uint8_t index;
542
507k
    if (!CBS_get_u8(&cbs, &index)) {
543
5.11k
      break;
544
5.11k
    }
545
546
502k
    kAPIs[index % std::size(kAPIs)](ctx.get(), &cbs);
547
502k
  }
548
549
5.13k
  UniquePtr<SSL> ssl(SSL_new(ctx.get()));
550
5.13k
  ERR_clear_error();
551
552
5.13k
  return 0;
553
5.13k
}