Skip to content

Commit 6a9c528

Browse files
davidbenevanlucas
authored andcommitted
crypto: account for new 1.1.0 SSL APIs
This is cherry-picked from PR #8491 and tidied up. This change does *not* account for the larger ticket key in OpenSSL 1.1.0. That will be done in a follow-up commit as the 48-byte ticket key is part of Node's public API. rvagg: removed BORINGSSL defines before landing PR-URL: #16130 Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Rod Vagg <[email protected]>
1 parent cc744b9 commit 6a9c528

File tree

2 files changed

+56
-22
lines changed

2 files changed

+56
-22
lines changed

src/node_crypto.cc

+49-22
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,28 @@ using v8::String;
113113
using v8::Value;
114114

115115

116+
#if OPENSSL_VERSION_NUMBER < 0x10100000L
117+
static void SSL_SESSION_get0_ticket(const SSL_SESSION* s,
118+
const unsigned char** tick, size_t* len) {
119+
*len = s->tlsext_ticklen;
120+
if (tick != nullptr) {
121+
*tick = s->tlsext_tick;
122+
}
123+
}
124+
125+
#define SSL_get_tlsext_status_type(ssl) (ssl->tlsext_status_type)
126+
127+
static int X509_STORE_up_ref(X509_STORE* store) {
128+
CRYPTO_add(&store->references, 1, CRYPTO_LOCK_X509_STORE);
129+
return 1;
130+
}
131+
132+
static int X509_up_ref(X509* cert) {
133+
CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509);
134+
return 1;
135+
}
136+
#endif // OPENSSL_VERSION_NUMBER < 0x10100000L
137+
116138
// Subject DER of CNNIC ROOT CA and CNNIC EV ROOT CA are taken from
117139
// https://hg.mozilla.org/mozilla-central/file/98820360ab66/security/
118140
// certverifier/NSSCertDBTrustDomain.cpp#l672
@@ -159,11 +181,19 @@ template void SSLWrap<TLSWrap>::AddMethods(Environment* env,
159181
template void SSLWrap<TLSWrap>::InitNPN(SecureContext* sc);
160182
template void SSLWrap<TLSWrap>::SetSNIContext(SecureContext* sc);
161183
template int SSLWrap<TLSWrap>::SetCACerts(SecureContext* sc);
184+
#if OPENSSL_VERSION_NUMBER < 0x10100000L
162185
template SSL_SESSION* SSLWrap<TLSWrap>::GetSessionCallback(
163186
SSL* s,
164187
unsigned char* key,
165188
int len,
166189
int* copy);
190+
#else
191+
template SSL_SESSION* SSLWrap<TLSWrap>::GetSessionCallback(
192+
SSL* s,
193+
const unsigned char* key,
194+
int len,
195+
int* copy);
196+
#endif
167197
template int SSLWrap<TLSWrap>::NewSessionCallback(SSL* s,
168198
SSL_SESSION* sess);
169199
template void SSLWrap<TLSWrap>::OnClientHello(
@@ -760,22 +790,6 @@ void SecureContext::SetCert(const FunctionCallbackInfo<Value>& args) {
760790
}
761791

762792

763-
#if OPENSSL_VERSION_NUMBER < 0x10100000L && !defined(OPENSSL_IS_BORINGSSL)
764-
// This section contains OpenSSL 1.1.0 functions reimplemented for OpenSSL
765-
// 1.0.2 so that the following code can be written without lots of #if lines.
766-
767-
static int X509_STORE_up_ref(X509_STORE* store) {
768-
CRYPTO_add(&store->references, 1, CRYPTO_LOCK_X509_STORE);
769-
return 1;
770-
}
771-
772-
static int X509_up_ref(X509* cert) {
773-
CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509);
774-
return 1;
775-
}
776-
#endif // OPENSSL_VERSION_NUMBER < 0x10100000L && !OPENSSL_IS_BORINGSSL
777-
778-
779793
static X509_STORE* NewRootCertStore() {
780794
static std::vector<X509*> root_certs_vector;
781795
if (root_certs_vector.empty()) {
@@ -1225,7 +1239,7 @@ void SecureContext::SetTicketKeys(const FunctionCallbackInfo<Value>& args) {
12251239

12261240

12271241
void SecureContext::SetFreeListLength(const FunctionCallbackInfo<Value>& args) {
1228-
#if OPENSSL_VERSION_NUMBER < 0x10100000L && !defined(OPENSSL_IS_BORINGSSL)
1242+
#if OPENSSL_VERSION_NUMBER < 0x10100000L
12291243
// |freelist_max_len| was removed in OpenSSL 1.1.0. In that version OpenSSL
12301244
// mallocs and frees buffers directly, without the use of a freelist.
12311245
SecureContext* wrap;
@@ -1432,11 +1446,19 @@ void SSLWrap<Base>::InitNPN(SecureContext* sc) {
14321446
}
14331447

14341448

1449+
#if OPENSSL_VERSION_NUMBER < 0x10100000L
14351450
template <class Base>
14361451
SSL_SESSION* SSLWrap<Base>::GetSessionCallback(SSL* s,
14371452
unsigned char* key,
14381453
int len,
14391454
int* copy) {
1455+
#else
1456+
template <class Base>
1457+
SSL_SESSION* SSLWrap<Base>::GetSessionCallback(SSL* s,
1458+
const unsigned char* key,
1459+
int len,
1460+
int* copy) {
1461+
#endif
14401462
Base* w = static_cast<Base*>(SSL_get_app_data(s));
14411463

14421464
*copy = 0;
@@ -1946,13 +1968,18 @@ void SSLWrap<Base>::GetTLSTicket(const FunctionCallbackInfo<Value>& args) {
19461968
Environment* env = w->ssl_env();
19471969

19481970
SSL_SESSION* sess = SSL_get_session(w->ssl_);
1949-
if (sess == nullptr || sess->tlsext_tick == nullptr)
1971+
if (sess == nullptr)
1972+
return;
1973+
1974+
const unsigned char *ticket;
1975+
size_t length;
1976+
SSL_SESSION_get0_ticket(sess, &ticket, &length);
1977+
1978+
if (ticket == nullptr)
19501979
return;
19511980

19521981
Local<Object> buff = Buffer::Copy(
1953-
env,
1954-
reinterpret_cast<char*>(sess->tlsext_tick),
1955-
sess->tlsext_ticklen).ToLocalChecked();
1982+
env, reinterpret_cast<const char*>(ticket), length).ToLocalChecked();
19561983

19571984
args.GetReturnValue().Set(buff);
19581985
}
@@ -2479,7 +2506,7 @@ int SSLWrap<Base>::SSLCertCallback(SSL* s, void* arg) {
24792506

24802507
bool ocsp = false;
24812508
#ifdef NODE__HAVE_TLSEXT_STATUS_CB
2482-
ocsp = s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp;
2509+
ocsp = SSL_get_tlsext_status_type(s) == TLSEXT_STATUSTYPE_ocsp;
24832510
#endif
24842511

24852512
info->Set(env->ocsp_request_string(), Boolean::New(env->isolate(), ocsp));

src/node_crypto.h

+7
Original file line numberDiff line numberDiff line change
@@ -241,10 +241,17 @@ class SSLWrap {
241241
static void InitNPN(SecureContext* sc);
242242
static void AddMethods(Environment* env, v8::Local<v8::FunctionTemplate> t);
243243

244+
#if OPENSSL_VERSION_NUMBER < 0x10100000L
244245
static SSL_SESSION* GetSessionCallback(SSL* s,
245246
unsigned char* key,
246247
int len,
247248
int* copy);
249+
#else
250+
static SSL_SESSION* GetSessionCallback(SSL* s,
251+
const unsigned char* key,
252+
int len,
253+
int* copy);
254+
#endif
248255
static int NewSessionCallback(SSL* s, SSL_SESSION* sess);
249256
static void OnClientHello(void* arg,
250257
const ClientHelloParser::ClientHello& hello);

0 commit comments

Comments
 (0)