grpc 1.65.0 → 1.65.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +1 -1
- data/src/core/client_channel/subchannel.cc +10 -7
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +3 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +6 -6
- data/src/core/ext/transport/inproc/inproc_transport.cc +2 -2
- data/src/core/handshaker/http_connect/http_connect_handshaker.cc +2 -2
- data/src/core/handshaker/http_connect/http_proxy_mapper.cc +7 -10
- data/src/core/lib/compression/message_compress.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +2 -1
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +6 -6
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +12 -6
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +3 -2
- data/src/core/lib/event_engine/windows/win_socket.cc +4 -2
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +5 -4
- data/src/core/lib/experiments/config.cc +11 -9
- data/src/core/lib/experiments/experiments.cc +1 -1
- data/src/core/lib/experiments/experiments.h +1 -2
- data/src/core/lib/gprpp/dual_ref_counted.h +30 -30
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +4 -4
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +16 -17
- data/src/core/lib/iomgr/socket_windows.cc +3 -3
- data/src/core/lib/iomgr/tcp_posix.cc +2 -2
- data/src/core/lib/iomgr/tcp_server_posix.cc +9 -12
- data/src/core/lib/iomgr/tcp_server_windows.cc +2 -2
- data/src/core/lib/promise/party.cc +4 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -2
- data/src/core/load_balancing/grpclb/grpclb.cc +14 -15
- data/src/core/server/server.cc +1 -1
- data/src/core/util/log.cc +10 -8
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +3 -5
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +7 -0
- data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.c +4 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu_intel.c +0 -15
- data/third_party/boringssl-with-bazel/src/crypto/crypto.c +7 -61
- data/third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.c +43 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +21 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +31 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +6 -4
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +22 -10
- data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +6 -11
- data/third_party/boringssl-with-bazel/src/include/openssl/experimental/dilithium.h +6 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/experimental/kyber.h +10 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/span.h +26 -12
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +83 -33
- data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +6 -8
- data/third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc +4 -4
- data/third_party/boringssl-with-bazel/src/ssl/dtls_record.cc +14 -13
- data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +22 -16
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -1
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +2 -1
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +15 -15
- data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +1 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +38 -27
- data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +59 -20
- data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +1 -1
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +2 -1
- data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +1 -1
- metadata +3 -3
@@ -612,6 +612,11 @@ static int ecp_nistz256_cmp_x_coordinate(const EC_GROUP *group,
|
|
612
612
|
}
|
613
613
|
|
614
614
|
DEFINE_METHOD_FUNCTION(EC_METHOD, EC_GFp_nistz256_method) {
|
615
|
+
// TODO(crbug.com/42290548): The x86_64 assembly depends on initializing
|
616
|
+
// |OPENSSL_ia32cap_P|. Move the dispatch to C. For now, explicitly initialize
|
617
|
+
// things.
|
618
|
+
OPENSSL_init_cpuid();
|
619
|
+
|
615
620
|
out->point_get_affine_coordinates = ecp_nistz256_get_affine;
|
616
621
|
out->add = ecp_nistz256_add;
|
617
622
|
out->dbl = ecp_nistz256_dbl;
|
@@ -72,7 +72,8 @@ int FIPS_query_algorithm_status(const char *algorithm) {
|
|
72
72
|
#if defined(BORINGSSL_FIPS_COUNTERS)
|
73
73
|
|
74
74
|
size_t FIPS_read_counter(enum fips_counter_t counter) {
|
75
|
-
|
75
|
+
size_t index = (size_t)counter;
|
76
|
+
if (index > fips_counter_max) {
|
76
77
|
abort();
|
77
78
|
}
|
78
79
|
|
@@ -82,11 +83,12 @@ size_t FIPS_read_counter(enum fips_counter_t counter) {
|
|
82
83
|
return 0;
|
83
84
|
}
|
84
85
|
|
85
|
-
return array[
|
86
|
+
return array[index];
|
86
87
|
}
|
87
88
|
|
88
89
|
void boringssl_fips_inc_counter(enum fips_counter_t counter) {
|
89
|
-
|
90
|
+
size_t index = (size_t)counter;
|
91
|
+
if (index > fips_counter_max) {
|
90
92
|
abort();
|
91
93
|
}
|
92
94
|
|
@@ -106,7 +108,7 @@ void boringssl_fips_inc_counter(enum fips_counter_t counter) {
|
|
106
108
|
}
|
107
109
|
}
|
108
110
|
|
109
|
-
array[
|
111
|
+
array[index]++;
|
110
112
|
}
|
111
113
|
|
112
114
|
#else
|
@@ -180,17 +180,29 @@ extern "C" {
|
|
180
180
|
#endif
|
181
181
|
|
182
182
|
|
183
|
-
#if defined(
|
184
|
-
defined(
|
185
|
-
|
183
|
+
#if !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_STATIC_ARMCAP) && \
|
184
|
+
(defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \
|
185
|
+
defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64))
|
186
|
+
// x86, x86_64, and the ARMs need to record the result of a cpuid/getauxval call
|
187
|
+
// for the asm to work correctly, unless compiled without asm code.
|
188
|
+
#define NEED_CPUID
|
189
|
+
|
190
|
+
// OPENSSL_cpuid_setup initializes the platform-specific feature cache. This
|
191
|
+
// function should not be called directly. Call |OPENSSL_init_cpuid| instead.
|
186
192
|
void OPENSSL_cpuid_setup(void);
|
193
|
+
|
194
|
+
// OPENSSL_init_cpuid initializes the platform-specific feature cache, if
|
195
|
+
// needed. This function is idempotent and may be called concurrently.
|
196
|
+
void OPENSSL_init_cpuid(void);
|
197
|
+
#else
|
198
|
+
OPENSSL_INLINE void OPENSSL_init_cpuid(void) {}
|
187
199
|
#endif
|
188
200
|
|
189
201
|
#if (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && \
|
190
202
|
!defined(OPENSSL_STATIC_ARMCAP)
|
191
203
|
// OPENSSL_get_armcap_pointer_for_test returns a pointer to |OPENSSL_armcap_P|
|
192
|
-
// for unit tests. Any modifications to the value must be made
|
193
|
-
//
|
204
|
+
// for unit tests. Any modifications to the value must be made before any other
|
205
|
+
// function call in BoringSSL.
|
194
206
|
OPENSSL_EXPORT uint32_t *OPENSSL_get_armcap_pointer_for_test(void);
|
195
207
|
#endif
|
196
208
|
|
@@ -1521,7 +1533,6 @@ OPENSSL_INLINE int CRYPTO_is_x86_SHA_capable(void) {
|
|
1521
1533
|
// otherwise select. See chacha-x86_64.pl.
|
1522
1534
|
//
|
1523
1535
|
// Bonnell, Silvermont's predecessor in the Atom lineup, will also be matched by
|
1524
|
-
// this. |OPENSSL_cpuid_setup| forces Knights Landing to also be matched by
|
1525
1536
|
// this. Goldmont (Silvermont's successor in the Atom lineup) added XSAVE so it
|
1526
1537
|
// isn't matched by this. Various sources indicate AMD first implemented MOVBE
|
1527
1538
|
// and XSAVE at the same time in Jaguar, so it seems like AMD chips will not be
|
@@ -1530,11 +1541,12 @@ OPENSSL_INLINE int CRYPTO_cpu_perf_is_like_silvermont(void) {
|
|
1530
1541
|
// WARNING: This MUST NOT be used to guard the execution of the XSAVE
|
1531
1542
|
// instruction. This is the "hardware supports XSAVE" bit, not the OSXSAVE bit
|
1532
1543
|
// that indicates whether we can safely execute XSAVE. This bit may be set
|
1533
|
-
// even when XSAVE is disabled (by the operating system). See the
|
1534
|
-
//
|
1544
|
+
// even when XSAVE is disabled (by the operating system). See how the users of
|
1545
|
+
// this bit use it.
|
1535
1546
|
//
|
1536
|
-
//
|
1537
|
-
//
|
1547
|
+
// Historically, the XSAVE bit was artificially cleared on Knights Landing
|
1548
|
+
// and Knights Mill chips, but as Intel has removed all support from GCC,
|
1549
|
+
// LLVM, and SDE, we assume they are no longer worth special-casing.
|
1538
1550
|
int hardware_supports_xsave = (OPENSSL_get_ia32cap(1) & (1u << 26)) != 0;
|
1539
1551
|
return !hardware_supports_xsave && CRYPTO_is_MOVBE_capable();
|
1540
1552
|
}
|
@@ -32,18 +32,9 @@ extern "C" {
|
|
32
32
|
#endif
|
33
33
|
|
34
34
|
|
35
|
-
// crypto.h contains functions for
|
35
|
+
// crypto.h contains functions for library-wide initialization and properties.
|
36
36
|
|
37
37
|
|
38
|
-
// CRYPTO_library_init initializes the crypto library. It must be called if the
|
39
|
-
// library is built with BORINGSSL_NO_STATIC_INITIALIZER. Otherwise, it does
|
40
|
-
// nothing and a static initializer is used instead. It is safe to call this
|
41
|
-
// function multiple times and concurrently from multiple threads.
|
42
|
-
//
|
43
|
-
// On some ARM configurations, this function may require filesystem access and
|
44
|
-
// should be called before entering a sandbox.
|
45
|
-
OPENSSL_EXPORT void CRYPTO_library_init(void);
|
46
|
-
|
47
38
|
// CRYPTO_is_confidential_build returns one if the linked version of BoringSSL
|
48
39
|
// has been built with the BORINGSSL_CONFIDENTIAL define and zero otherwise.
|
49
40
|
//
|
@@ -164,7 +155,7 @@ OPENSSL_EXPORT void OPENSSL_load_builtin_modules(void);
|
|
164
155
|
#define OPENSSL_INIT_NO_LOAD_CONFIG 0
|
165
156
|
#define OPENSSL_INIT_NO_ATEXIT 0
|
166
157
|
|
167
|
-
// OPENSSL_init_crypto
|
158
|
+
// OPENSSL_init_crypto returns one.
|
168
159
|
OPENSSL_EXPORT int OPENSSL_init_crypto(uint64_t opts,
|
169
160
|
const OPENSSL_INIT_SETTINGS *settings);
|
170
161
|
|
@@ -199,6 +190,10 @@ OPENSSL_EXPORT int FIPS_query_algorithm_status(const char *algorithm);
|
|
199
190
|
OPENSSL_EXPORT int CRYPTO_has_broken_NEON(void);
|
200
191
|
#endif
|
201
192
|
|
193
|
+
// CRYPTO_library_init does nothing. Historically, it was needed in some build
|
194
|
+
// configurations to initialization the library. This is no longer necessary.
|
195
|
+
OPENSSL_EXPORT void CRYPTO_library_init(void);
|
196
|
+
|
202
197
|
|
203
198
|
#if defined(__cplusplus)
|
204
199
|
} // extern C
|
@@ -70,6 +70,12 @@ OPENSSL_EXPORT int DILITHIUM_generate_key(
|
|
70
70
|
uint8_t out_encoded_public_key[DILITHIUM_PUBLIC_KEY_BYTES],
|
71
71
|
struct DILITHIUM_private_key *out_private_key);
|
72
72
|
|
73
|
+
// DILITHIUM_public_from_private sets |*out_public_key| to the public key that
|
74
|
+
// corresponds to |private_key|. Returns 1 on success and 0 on failure.
|
75
|
+
OPENSSL_EXPORT int DILITHIUM_public_from_private(
|
76
|
+
struct DILITHIUM_public_key *out_public_key,
|
77
|
+
const struct DILITHIUM_private_key *private_key);
|
78
|
+
|
73
79
|
// DILITHIUM_sign generates a signature for the message |msg| of length
|
74
80
|
// |msg_len| using |private_key| following the randomized algorithm, and writes
|
75
81
|
// the encoded signature to |out_encoded_signature|. Returns 1 on success and 0
|
@@ -22,6 +22,14 @@ extern "C" {
|
|
22
22
|
#endif
|
23
23
|
|
24
24
|
|
25
|
+
#if defined(OPENSSL_UNSTABLE_EXPERIMENTAL_KYBER)
|
26
|
+
// This header implements experimental, draft versions of not-yet-standardized
|
27
|
+
// primitives. When the standard is complete, these functions will be removed
|
28
|
+
// and replaced with the final, incompatible standard version. They are
|
29
|
+
// available now for short-lived experiments, but must not be deployed anywhere
|
30
|
+
// durable, such as a long-lived key store. To use these functions define
|
31
|
+
// OPENSSL_UNSTABLE_EXPERIMENTAL_KYBER
|
32
|
+
|
25
33
|
// Kyber768.
|
26
34
|
//
|
27
35
|
// This implements the round-3 specification of Kyber, defined at
|
@@ -128,6 +136,8 @@ OPENSSL_EXPORT int KYBER_marshal_private_key(
|
|
128
136
|
OPENSSL_EXPORT int KYBER_parse_private_key(
|
129
137
|
struct KYBER_private_key *out_private_key, CBS *in);
|
130
138
|
|
139
|
+
#endif // OPENSSL_UNSTABLE_EXPERIMENTAL_KYBER
|
140
|
+
|
131
141
|
|
132
142
|
#if defined(__cplusplus)
|
133
143
|
} // extern C
|
@@ -49,6 +49,16 @@ class SpanBase {
|
|
49
49
|
|
50
50
|
friend bool operator!=(Span<T> lhs, Span<T> rhs) { return !(lhs == rhs); }
|
51
51
|
};
|
52
|
+
|
53
|
+
// Heuristically test whether C is a container type that can be converted into
|
54
|
+
// a Span<T> by checking for data() and size() member functions.
|
55
|
+
//
|
56
|
+
// TODO(davidben): Require C++17 support for std::is_convertible_v, etc.
|
57
|
+
template <typename C, typename T>
|
58
|
+
using EnableIfContainer = std::enable_if_t<
|
59
|
+
std::is_convertible<decltype(std::declval<C>().data()), T *>::value &&
|
60
|
+
std::is_integral<decltype(std::declval<C>().size())>::value>;
|
61
|
+
|
52
62
|
} // namespace internal
|
53
63
|
|
54
64
|
// A Span<T> is a non-owning reference to a contiguous array of objects of type
|
@@ -84,16 +94,6 @@ class SpanBase {
|
|
84
94
|
// a reference or pointer to a container or array.
|
85
95
|
template <typename T>
|
86
96
|
class Span : private internal::SpanBase<const T> {
|
87
|
-
private:
|
88
|
-
// Heuristically test whether C is a container type that can be converted into
|
89
|
-
// a Span by checking for data() and size() member functions.
|
90
|
-
//
|
91
|
-
// TODO(davidben): Require C++17 support for std::is_convertible_v, etc.
|
92
|
-
template <typename C>
|
93
|
-
using EnableIfContainer = std::enable_if_t<
|
94
|
-
std::is_convertible<decltype(std::declval<C>().data()), T *>::value &&
|
95
|
-
std::is_integral<decltype(std::declval<C>().size())>::value>;
|
96
|
-
|
97
97
|
public:
|
98
98
|
static const size_t npos = static_cast<size_t>(-1);
|
99
99
|
|
@@ -114,12 +114,12 @@ class Span : private internal::SpanBase<const T> {
|
|
114
114
|
template <size_t N>
|
115
115
|
constexpr Span(T (&array)[N]) : Span(array, N) {}
|
116
116
|
|
117
|
-
template <typename C, typename = EnableIfContainer<C>,
|
117
|
+
template <typename C, typename = internal::EnableIfContainer<C, T>,
|
118
118
|
typename = std::enable_if_t<std::is_const<T>::value, C>>
|
119
119
|
constexpr Span(const C &container)
|
120
120
|
: data_(container.data()), size_(container.size()) {}
|
121
121
|
|
122
|
-
template <typename C, typename = EnableIfContainer<C>,
|
122
|
+
template <typename C, typename = internal::EnableIfContainer<C, T>,
|
123
123
|
typename = std::enable_if_t<!std::is_const<T>::value, C>>
|
124
124
|
constexpr explicit Span(C &container)
|
125
125
|
: data_(container.data()), size_(container.size()) {}
|
@@ -188,6 +188,20 @@ class Span : private internal::SpanBase<const T> {
|
|
188
188
|
template <typename T>
|
189
189
|
const size_t Span<T>::npos;
|
190
190
|
|
191
|
+
#if __cplusplus >= 201703L
|
192
|
+
template <typename T>
|
193
|
+
Span(T *, size_t) -> Span<T>;
|
194
|
+
template <typename T, size_t size>
|
195
|
+
Span(T (&array)[size]) -> Span<T>;
|
196
|
+
template <
|
197
|
+
typename C,
|
198
|
+
typename T = std::remove_pointer_t<decltype(std::declval<C>().data())>,
|
199
|
+
typename = internal::EnableIfContainer<C, T>>
|
200
|
+
Span(C &) -> Span<T>;
|
201
|
+
#endif
|
202
|
+
|
203
|
+
// C++17 callers can instead rely on CTAD and the deduction guides defined
|
204
|
+
// above.
|
191
205
|
template <typename T>
|
192
206
|
constexpr Span<T> MakeSpan(T *ptr, size_t size) {
|
193
207
|
return Span<T>(ptr, size);
|
@@ -1205,6 +1205,11 @@ OPENSSL_EXPORT int SSL_set_ocsp_response(SSL *ssl,
|
|
1205
1205
|
#define SSL_SIGN_RSA_PSS_RSAE_SHA512 0x0806
|
1206
1206
|
#define SSL_SIGN_ED25519 0x0807
|
1207
1207
|
|
1208
|
+
// SSL_SIGN_RSA_PKCS1_SHA256_LEGACY is a backport of RSASSA-PKCS1-v1_5 with
|
1209
|
+
// SHA-256 to TLS 1.3. It is disabled by default and only defined for client
|
1210
|
+
// certificates.
|
1211
|
+
#define SSL_SIGN_RSA_PKCS1_SHA256_LEGACY 0x0420
|
1212
|
+
|
1208
1213
|
// SSL_SIGN_RSA_PKCS1_MD5_SHA1 is an internal signature algorithm used to
|
1209
1214
|
// specify raw RSASSA-PKCS1-v1_5 with an MD5/SHA-1 concatenation, as used in TLS
|
1210
1215
|
// before TLS 1.2.
|
@@ -3115,7 +3120,8 @@ OPENSSL_EXPORT int SSL_set_alpn_protos(SSL *ssl, const uint8_t *protos,
|
|
3115
3120
|
|
3116
3121
|
// SSL_CTX_set_alpn_select_cb sets a callback function on |ctx| that is called
|
3117
3122
|
// during ClientHello processing in order to select an ALPN protocol from the
|
3118
|
-
// client's list of offered protocols.
|
3123
|
+
// client's list of offered protocols. |SSL_select_next_proto| is an optional
|
3124
|
+
// utility function which may be useful in implementing this callback.
|
3119
3125
|
//
|
3120
3126
|
// The callback is passed a wire-format (i.e. a series of non-empty, 8-bit
|
3121
3127
|
// length-prefixed strings) ALPN protocol list in |in|. To select a protocol,
|
@@ -3265,30 +3271,50 @@ OPENSSL_EXPORT int SSL_CTX_add_cert_compression_alg(
|
|
3265
3271
|
// and deprecated in favor of it.
|
3266
3272
|
|
3267
3273
|
// SSL_CTX_set_next_protos_advertised_cb sets a callback that is called when a
|
3268
|
-
// TLS server needs a list of supported protocols for Next Protocol
|
3269
|
-
//
|
3270
|
-
//
|
3271
|
-
//
|
3272
|
-
//
|
3273
|
-
//
|
3274
|
-
//
|
3275
|
-
//
|
3274
|
+
// TLS server needs a list of supported protocols for Next Protocol Negotiation.
|
3275
|
+
//
|
3276
|
+
// If the callback wishes to advertise NPN to the client, it should return
|
3277
|
+
// |SSL_TLSEXT_ERR_OK| and then set |*out| and |*out_len| to describe to a
|
3278
|
+
// buffer containing a (possibly empty) list of supported protocols in wire
|
3279
|
+
// format. That is, each protocol is prefixed with a 1-byte length, then
|
3280
|
+
// concatenated. From there, the client will select a protocol, possibly one not
|
3281
|
+
// on the server's list. The caller can use |SSL_get0_next_proto_negotiated|
|
3282
|
+
// after the handshake completes to query the final protocol.
|
3283
|
+
//
|
3284
|
+
// The returned buffer must remain valid and unmodified for at least the
|
3285
|
+
// duration of the |SSL| operation (e.g. |SSL_do_handshake|) that triggered the
|
3286
|
+
// callback.
|
3287
|
+
//
|
3288
|
+
// If the caller wishes not to advertise NPN, it should return
|
3289
|
+
// |SSL_TLSEXT_ERR_NOACK|. No NPN extension will be included in the ServerHello,
|
3290
|
+
// and the TLS server will behave as if it does not implement NPN.
|
3276
3291
|
OPENSSL_EXPORT void SSL_CTX_set_next_protos_advertised_cb(
|
3277
3292
|
SSL_CTX *ctx,
|
3278
3293
|
int (*cb)(SSL *ssl, const uint8_t **out, unsigned *out_len, void *arg),
|
3279
3294
|
void *arg);
|
3280
3295
|
|
3281
3296
|
// SSL_CTX_set_next_proto_select_cb sets a callback that is called when a client
|
3282
|
-
// needs to select a protocol from the server's provided list
|
3283
|
-
//
|
3284
|
-
//
|
3285
|
-
//
|
3286
|
-
//
|
3287
|
-
//
|
3288
|
-
//
|
3289
|
-
//
|
3290
|
-
//
|
3291
|
-
//
|
3297
|
+
// needs to select a protocol from the server's provided list, passed in wire
|
3298
|
+
// format in |in_len| bytes from |in|. The callback can assume that |in| is
|
3299
|
+
// syntactically valid. |SSL_select_next_proto| is an optional utility function
|
3300
|
+
// which may be useful in implementing this callback.
|
3301
|
+
//
|
3302
|
+
// On success, the callback should return |SSL_TLSEXT_ERR_OK| and set |*out| and
|
3303
|
+
// |*out_len| to describe a buffer containing the selected protocol, or an
|
3304
|
+
// empty buffer to select no protocol. The returned buffer may point within
|
3305
|
+
// |in|, or it may point to some other buffer that remains valid and unmodified
|
3306
|
+
// for at least the duration of the |SSL| operation (e.g. |SSL_do_handshake|)
|
3307
|
+
// that triggered the callback.
|
3308
|
+
//
|
3309
|
+
// Returning any other value indicates a fatal error and will terminate the TLS
|
3310
|
+
// connection. To proceed without selecting a protocol, the callback must return
|
3311
|
+
// |SSL_TLSEXT_ERR_OK| and set |*out| and |*out_len| to an empty buffer. (E.g.
|
3312
|
+
// NULL and zero, respectively.)
|
3313
|
+
//
|
3314
|
+
// Configuring this callback enables NPN on a client. Although the callback can
|
3315
|
+
// then decline to negotiate a protocol, merely configuring the callback causes
|
3316
|
+
// the client to offer NPN in the ClientHello. Callers thus should not configure
|
3317
|
+
// this callback in TLS client contexts that are not intended to use NPN.
|
3292
3318
|
OPENSSL_EXPORT void SSL_CTX_set_next_proto_select_cb(
|
3293
3319
|
SSL_CTX *ctx, int (*cb)(SSL *ssl, uint8_t **out, uint8_t *out_len,
|
3294
3320
|
const uint8_t *in, unsigned in_len, void *arg),
|
@@ -3296,7 +3322,7 @@ OPENSSL_EXPORT void SSL_CTX_set_next_proto_select_cb(
|
|
3296
3322
|
|
3297
3323
|
// SSL_get0_next_proto_negotiated sets |*out_data| and |*out_len| to point to
|
3298
3324
|
// the client's requested protocol for this connection. If the client didn't
|
3299
|
-
// request any protocol, then |*
|
3325
|
+
// request any protocol, then |*out_len| is set to zero.
|
3300
3326
|
//
|
3301
3327
|
// Note that the client can request any protocol it chooses. The value returned
|
3302
3328
|
// from this function need not be a member of the list of supported protocols
|
@@ -3305,21 +3331,45 @@ OPENSSL_EXPORT void SSL_get0_next_proto_negotiated(const SSL *ssl,
|
|
3305
3331
|
const uint8_t **out_data,
|
3306
3332
|
unsigned *out_len);
|
3307
3333
|
|
3308
|
-
// SSL_select_next_proto implements the standard protocol selection
|
3309
|
-
// expected that this function is called from
|
3334
|
+
// SSL_select_next_proto implements the standard protocol selection for either
|
3335
|
+
// ALPN servers or NPN clients. It is expected that this function is called from
|
3336
|
+
// the callback set by |SSL_CTX_set_alpn_select_cb| or
|
3310
3337
|
// |SSL_CTX_set_next_proto_select_cb|.
|
3311
3338
|
//
|
3312
|
-
// |peer| and |supported|
|
3313
|
-
//
|
3314
|
-
//
|
3315
|
-
//
|
3316
|
-
// non-empty.
|
3317
|
-
//
|
3318
|
-
// This function finds the first protocol in |peer| which is also in
|
3319
|
-
// |supported|. If one was found, it sets |*out| and |*out_len| to point to it
|
3320
|
-
// and returns |OPENSSL_NPN_NEGOTIATED|. Otherwise, it returns
|
3339
|
+
// |peer| and |supported| contain the peer and locally-configured protocols,
|
3340
|
+
// respectively. This function finds the first protocol in |peer| which is also
|
3341
|
+
// in |supported|. If one was found, it sets |*out| and |*out_len| to point to
|
3342
|
+
// it and returns |OPENSSL_NPN_NEGOTIATED|. Otherwise, it returns
|
3321
3343
|
// |OPENSSL_NPN_NO_OVERLAP| and sets |*out| and |*out_len| to the first
|
3322
3344
|
// supported protocol.
|
3345
|
+
//
|
3346
|
+
// In ALPN, the server should only select protocols among those that the client
|
3347
|
+
// offered. Thus, if this function returns |OPENSSL_NPN_NO_OVERLAP|, the caller
|
3348
|
+
// should ignore |*out| and return |SSL_TLSEXT_ERR_ALERT_FATAL| from
|
3349
|
+
// |SSL_CTX_set_alpn_select_cb|'s callback to indicate there was no match.
|
3350
|
+
//
|
3351
|
+
// In NPN, the client may either select one of the server's protocols, or an
|
3352
|
+
// "opportunistic" protocol as described in Section 6 of
|
3353
|
+
// draft-agl-tls-nextprotoneg-03. When this function returns
|
3354
|
+
// |OPENSSL_NPN_NO_OVERLAP|, |*out| implicitly selects the first supported
|
3355
|
+
// protocol for use as the opportunistic protocol. The caller may use it,
|
3356
|
+
// ignore it and select a different opportunistic protocol, or ignore it and
|
3357
|
+
// select no protocol (empty string).
|
3358
|
+
//
|
3359
|
+
// |peer| and |supported| must be vectors of 8-bit, length-prefixed byte
|
3360
|
+
// strings. The length byte itself is not included in the length. A byte string
|
3361
|
+
// of length 0 is invalid. No byte string may be truncated. |supported| must be
|
3362
|
+
// non-empty; a caller that supports no ALPN/NPN protocols should skip
|
3363
|
+
// negotiating the extension, rather than calling this function. If any of these
|
3364
|
+
// preconditions do not hold, this function will return |OPENSSL_NPN_NO_OVERLAP|
|
3365
|
+
// and set |*out| and |*out_len| to an empty buffer for robustness, but callers
|
3366
|
+
// are not recommended to rely on this. An empty buffer is not a valid output
|
3367
|
+
// for |SSL_CTX_set_alpn_select_cb|'s callback.
|
3368
|
+
//
|
3369
|
+
// WARNING: |*out| and |*out_len| may alias either |peer| or |supported| and may
|
3370
|
+
// not be used after one of those buffers is modified or released. Additionally,
|
3371
|
+
// this function is not const-correct for compatibility reasons. Although |*out|
|
3372
|
+
// is a non-const pointer, callers may not modify the buffer though |*out|.
|
3323
3373
|
OPENSSL_EXPORT int SSL_select_next_proto(uint8_t **out, uint8_t *out_len,
|
3324
3374
|
const uint8_t *peer, unsigned peer_len,
|
3325
3375
|
const uint8_t *supported,
|
@@ -4814,7 +4864,7 @@ OPENSSL_EXPORT void SSL_set_check_ecdsa_curve(SSL *ssl, int enable);
|
|
4814
4864
|
|
4815
4865
|
// Deprecated functions.
|
4816
4866
|
|
4817
|
-
// SSL_library_init
|
4867
|
+
// SSL_library_init returns one.
|
4818
4868
|
OPENSSL_EXPORT int SSL_library_init(void);
|
4819
4869
|
|
4820
4870
|
// SSL_CIPHER_description writes a description of |cipher| into |buf| and
|
@@ -5377,7 +5427,7 @@ OPENSSL_EXPORT SSL_SESSION *SSL_get1_session(SSL *ssl);
|
|
5377
5427
|
#define OPENSSL_INIT_LOAD_SSL_STRINGS 0
|
5378
5428
|
#define OPENSSL_INIT_SSL_DEFAULT 0
|
5379
5429
|
|
5380
|
-
// OPENSSL_init_ssl
|
5430
|
+
// OPENSSL_init_ssl returns one.
|
5381
5431
|
OPENSSL_EXPORT int OPENSSL_init_ssl(uint64_t opts,
|
5382
5432
|
const OPENSSL_INIT_SETTINGS *settings);
|
5383
5433
|
|
@@ -624,16 +624,14 @@ static enum seal_result_t seal_next_message(SSL *ssl, uint8_t *out,
|
|
624
624
|
assert(ssl->d1->outgoing_written < ssl->d1->outgoing_messages_len);
|
625
625
|
assert(msg == &ssl->d1->outgoing_messages[ssl->d1->outgoing_written]);
|
626
626
|
|
627
|
-
|
628
|
-
|
629
|
-
use_epoch = dtls1_use_previous_epoch;
|
630
|
-
} else if (msg->epoch != ssl->d1->w_epoch) {
|
627
|
+
if (msg->epoch != ssl->d1->w_epoch &&
|
628
|
+
(ssl->d1->w_epoch == 0 || msg->epoch != ssl->d1->w_epoch - 1)) {
|
631
629
|
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
|
632
630
|
return seal_error;
|
633
631
|
}
|
634
632
|
|
635
|
-
size_t overhead = dtls_max_seal_overhead(ssl,
|
636
|
-
size_t prefix = dtls_seal_prefix_len(ssl,
|
633
|
+
size_t overhead = dtls_max_seal_overhead(ssl, msg->epoch);
|
634
|
+
size_t prefix = dtls_seal_prefix_len(ssl, msg->epoch);
|
637
635
|
|
638
636
|
if (msg->is_ccs) {
|
639
637
|
// Check there is room for the ChangeCipherSpec.
|
@@ -644,7 +642,7 @@ static enum seal_result_t seal_next_message(SSL *ssl, uint8_t *out,
|
|
644
642
|
|
645
643
|
if (!dtls_seal_record(ssl, out, out_len, max_out,
|
646
644
|
SSL3_RT_CHANGE_CIPHER_SPEC, kChangeCipherSpec,
|
647
|
-
sizeof(kChangeCipherSpec),
|
645
|
+
sizeof(kChangeCipherSpec), msg->epoch)) {
|
648
646
|
return seal_error;
|
649
647
|
}
|
650
648
|
|
@@ -697,7 +695,7 @@ static enum seal_result_t seal_next_message(SSL *ssl, uint8_t *out,
|
|
697
695
|
MakeSpan(frag, frag_len));
|
698
696
|
|
699
697
|
if (!dtls_seal_record(ssl, out, out_len, max_out, SSL3_RT_HANDSHAKE,
|
700
|
-
out + prefix, frag_len,
|
698
|
+
out + prefix, frag_len, msg->epoch)) {
|
701
699
|
return seal_error;
|
702
700
|
}
|
703
701
|
|
@@ -208,7 +208,7 @@ int dtls1_write_app_data(SSL *ssl, bool *out_needs_handshake,
|
|
208
208
|
}
|
209
209
|
|
210
210
|
int ret = dtls1_write_record(ssl, SSL3_RT_APPLICATION_DATA, in,
|
211
|
-
|
211
|
+
ssl->d1->w_epoch);
|
212
212
|
if (ret <= 0) {
|
213
213
|
return ret;
|
214
214
|
}
|
@@ -217,7 +217,7 @@ int dtls1_write_app_data(SSL *ssl, bool *out_needs_handshake,
|
|
217
217
|
}
|
218
218
|
|
219
219
|
int dtls1_write_record(SSL *ssl, int type, Span<const uint8_t> in,
|
220
|
-
|
220
|
+
uint16_t epoch) {
|
221
221
|
SSLBuffer *buf = &ssl->s3->write_buffer;
|
222
222
|
assert(in.size() <= SSL3_RT_MAX_PLAIN_LENGTH);
|
223
223
|
// There should never be a pending write buffer in DTLS. One can't write half
|
@@ -235,7 +235,7 @@ int dtls1_write_record(SSL *ssl, int type, Span<const uint8_t> in,
|
|
235
235
|
in.size() + SSL_max_seal_overhead(ssl)) ||
|
236
236
|
!dtls_seal_record(ssl, buf->remaining().data(), &ciphertext_len,
|
237
237
|
buf->remaining().size(), type, in.data(), in.size(),
|
238
|
-
|
238
|
+
epoch)) {
|
239
239
|
buf->Clear();
|
240
240
|
return -1;
|
241
241
|
}
|
@@ -250,7 +250,7 @@ int dtls1_write_record(SSL *ssl, int type, Span<const uint8_t> in,
|
|
250
250
|
|
251
251
|
int dtls1_dispatch_alert(SSL *ssl) {
|
252
252
|
int ret = dtls1_write_record(ssl, SSL3_RT_ALERT, ssl->s3->send_alert,
|
253
|
-
|
253
|
+
ssl->d1->w_epoch);
|
254
254
|
if (ret <= 0) {
|
255
255
|
return ret;
|
256
256
|
}
|
@@ -258,29 +258,30 @@ enum ssl_open_record_t dtls_open_record(SSL *ssl, uint8_t *out_type,
|
|
258
258
|
}
|
259
259
|
|
260
260
|
static const SSLAEADContext *get_write_aead(const SSL *ssl,
|
261
|
-
|
262
|
-
if (
|
263
|
-
assert(ssl->d1->w_epoch
|
261
|
+
uint16_t epoch) {
|
262
|
+
if (epoch < ssl->d1->w_epoch) {
|
263
|
+
assert(epoch + 1 == ssl->d1->w_epoch);
|
264
264
|
return ssl->d1->last_aead_write_ctx.get();
|
265
265
|
}
|
266
266
|
|
267
|
+
assert(epoch == ssl->d1->w_epoch);
|
267
268
|
return ssl->s3->aead_write_ctx.get();
|
268
269
|
}
|
269
270
|
|
270
271
|
size_t dtls_max_seal_overhead(const SSL *ssl,
|
271
|
-
|
272
|
-
return DTLS1_RT_HEADER_LENGTH + get_write_aead(ssl,
|
272
|
+
uint16_t epoch) {
|
273
|
+
return DTLS1_RT_HEADER_LENGTH + get_write_aead(ssl, epoch)->MaxOverhead();
|
273
274
|
}
|
274
275
|
|
275
|
-
size_t dtls_seal_prefix_len(const SSL *ssl,
|
276
|
+
size_t dtls_seal_prefix_len(const SSL *ssl, uint16_t epoch) {
|
276
277
|
return DTLS1_RT_HEADER_LENGTH +
|
277
|
-
get_write_aead(ssl,
|
278
|
+
get_write_aead(ssl, epoch)->ExplicitNonceLen();
|
278
279
|
}
|
279
280
|
|
280
281
|
bool dtls_seal_record(SSL *ssl, uint8_t *out, size_t *out_len, size_t max_out,
|
281
282
|
uint8_t type, const uint8_t *in, size_t in_len,
|
282
|
-
|
283
|
-
const size_t prefix = dtls_seal_prefix_len(ssl,
|
283
|
+
uint16_t epoch) {
|
284
|
+
const size_t prefix = dtls_seal_prefix_len(ssl, epoch);
|
284
285
|
if (buffers_alias(in, in_len, out, max_out) &&
|
285
286
|
(max_out < prefix || out + prefix != in)) {
|
286
287
|
OPENSSL_PUT_ERROR(SSL, SSL_R_OUTPUT_ALIASES_INPUT);
|
@@ -288,14 +289,14 @@ bool dtls_seal_record(SSL *ssl, uint8_t *out, size_t *out_len, size_t max_out,
|
|
288
289
|
}
|
289
290
|
|
290
291
|
// Determine the parameters for the current epoch.
|
291
|
-
uint16_t epoch = ssl->d1->w_epoch;
|
292
292
|
SSLAEADContext *aead = ssl->s3->aead_write_ctx.get();
|
293
293
|
uint64_t *seq = &ssl->s3->write_sequence;
|
294
|
-
if (
|
295
|
-
assert(ssl->d1->w_epoch
|
296
|
-
epoch = ssl->d1->w_epoch - 1;
|
294
|
+
if (epoch < ssl->d1->w_epoch) {
|
295
|
+
assert(epoch + 1 == ssl->d1->w_epoch);
|
297
296
|
aead = ssl->d1->last_aead_write_ctx.get();
|
298
297
|
seq = &ssl->d1->last_write_sequence;
|
298
|
+
} else {
|
299
|
+
assert(epoch == ssl->d1->w_epoch);
|
299
300
|
}
|
300
301
|
|
301
302
|
if (max_out < DTLS1_RT_HEADER_LENGTH) {
|
@@ -441,16 +441,18 @@ bool tls12_add_verify_sigalgs(const SSL_HANDSHAKE *hs, CBB *out) {
|
|
441
441
|
}
|
442
442
|
|
443
443
|
bool tls12_check_peer_sigalg(const SSL_HANDSHAKE *hs, uint8_t *out_alert,
|
444
|
-
uint16_t sigalg) {
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
444
|
+
uint16_t sigalg, EVP_PKEY *pkey) {
|
445
|
+
// The peer must have selected an algorithm that is consistent with its public
|
446
|
+
// key, the TLS version, and what we advertised.
|
447
|
+
Span<const uint16_t> sigalgs = tls12_get_verify_sigalgs(hs);
|
448
|
+
if (std::find(sigalgs.begin(), sigalgs.end(), sigalg) == sigalgs.end() ||
|
449
|
+
!ssl_pkey_supports_algorithm(hs->ssl, pkey, sigalg, /*is_verify=*/true)) {
|
450
|
+
OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SIGNATURE_TYPE);
|
451
|
+
*out_alert = SSL_AD_ILLEGAL_PARAMETER;
|
452
|
+
return false;
|
449
453
|
}
|
450
454
|
|
451
|
-
|
452
|
-
*out_alert = SSL_AD_ILLEGAL_PARAMETER;
|
453
|
-
return false;
|
455
|
+
return true;
|
454
456
|
}
|
455
457
|
|
456
458
|
// tls_extension represents a TLS extension that is handled internally.
|
@@ -1474,16 +1476,19 @@ bool ssl_is_alpn_protocol_allowed(const SSL_HANDSHAKE *hs,
|
|
1474
1476
|
}
|
1475
1477
|
|
1476
1478
|
// Check that the protocol name is one of the ones we advertised.
|
1477
|
-
|
1478
|
-
|
1479
|
-
|
1480
|
-
|
1481
|
-
|
1482
|
-
|
1479
|
+
return ssl_alpn_list_contains_protocol(hs->config->alpn_client_proto_list,
|
1480
|
+
protocol);
|
1481
|
+
}
|
1482
|
+
|
1483
|
+
bool ssl_alpn_list_contains_protocol(Span<const uint8_t> list,
|
1484
|
+
Span<const uint8_t> protocol) {
|
1485
|
+
CBS cbs = list, candidate;
|
1486
|
+
while (CBS_len(&cbs) > 0) {
|
1487
|
+
if (!CBS_get_u8_length_prefixed(&cbs, &candidate)) {
|
1483
1488
|
return false;
|
1484
1489
|
}
|
1485
1490
|
|
1486
|
-
if (
|
1491
|
+
if (candidate == protocol) {
|
1487
1492
|
return true;
|
1488
1493
|
}
|
1489
1494
|
}
|
@@ -4144,7 +4149,8 @@ bool tls1_choose_signature_algorithm(SSL_HANDSHAKE *hs,
|
|
4144
4149
|
? MakeConstSpan(kSignSignatureAlgorithms)
|
4145
4150
|
: cred->sigalgs;
|
4146
4151
|
for (uint16_t sigalg : sigalgs) {
|
4147
|
-
if (!ssl_pkey_supports_algorithm(ssl, cred->pubkey.get(), sigalg
|
4152
|
+
if (!ssl_pkey_supports_algorithm(ssl, cred->pubkey.get(), sigalg,
|
4153
|
+
/*is_verify=*/false)) {
|
4148
4154
|
continue;
|
4149
4155
|
}
|
4150
4156
|
|