Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Side by Side Diff: net/socket/ssl_client_socket_openssl.cc

Issue 1360633002: Implement Token Binding negotiation TLS extension (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@test-server-flags
Patch Set: rebase Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // OpenSSL binding for SSLClientSocket. The class layout and general principle 5 // OpenSSL binding for SSLClientSocket. The class layout and general principle
6 // of operation is derived from SSLClientSocketNSS. 6 // of operation is derived from SSLClientSocketNSS.
7 7
8 #include "net/socket/ssl_client_socket_openssl.h" 8 #include "net/socket/ssl_client_socket_openssl.h"
9 9
10 #include <errno.h> 10 #include <errno.h>
11 #include <openssl/bio.h> 11 #include <openssl/bio.h>
12 #include <openssl/bytestring.h>
12 #include <openssl/err.h> 13 #include <openssl/err.h>
14 #include <openssl/evp.h>
13 #include <openssl/mem.h> 15 #include <openssl/mem.h>
14 #include <openssl/ssl.h> 16 #include <openssl/ssl.h>
15 #include <string.h> 17 #include <string.h>
16 18
17 #include "base/bind.h" 19 #include "base/bind.h"
18 #include "base/callback_helpers.h" 20 #include "base/callback_helpers.h"
19 #include "base/environment.h" 21 #include "base/environment.h"
20 #include "base/lazy_instance.h" 22 #include "base/lazy_instance.h"
21 #include "base/memory/singleton.h" 23 #include "base/memory/singleton.h"
22 #include "base/metrics/histogram_macros.h" 24 #include "base/metrics/histogram_macros.h"
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 !ssl_keylog_file.empty()) { 255 !ssl_keylog_file.empty()) {
254 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); 256 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
255 BIO* bio = BIO_new_file(ssl_keylog_file.c_str(), "a"); 257 BIO* bio = BIO_new_file(ssl_keylog_file.c_str(), "a");
256 if (!bio) { 258 if (!bio) {
257 LOG(ERROR) << "Failed to open " << ssl_keylog_file; 259 LOG(ERROR) << "Failed to open " << ssl_keylog_file;
258 ERR_print_errors_cb(&LogErrorCallback, NULL); 260 ERR_print_errors_cb(&LogErrorCallback, NULL);
259 } else { 261 } else {
260 SSL_CTX_set_keylog_bio(ssl_ctx_.get(), bio); 262 SSL_CTX_set_keylog_bio(ssl_ctx_.get(), bio);
261 } 263 }
262 } 264 }
265
266 if (!TokenBindingExtension::RegisterCallbacks(ssl_ctx_.get())) {
267 DLOG(ERROR) << "Failed to register calllbacks for token binding";
mattm 2015/09/24 22:13:12 dcheck?
nharper 2015/09/28 21:43:39 Done.
268 }
263 } 269 }
264 270
265 static int ClientCertRequestCallback(SSL* ssl, void* arg) { 271 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
266 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); 272 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl);
267 DCHECK(socket); 273 DCHECK(socket);
268 return socket->ClientCertRequestCallback(ssl); 274 return socket->ClientCertRequestCallback(ssl);
269 } 275 }
270 276
271 static int CertVerifyCallback(X509_STORE_CTX *store_ctx, void *arg) { 277 static int CertVerifyCallback(X509_STORE_CTX *store_ctx, void *arg) {
272 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data( 278 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 int ssl_socket_data_index_; 337 int ssl_socket_data_index_;
332 338
333 ScopedSSL_CTX ssl_ctx_; 339 ScopedSSL_CTX ssl_ctx_;
334 340
335 // TODO(davidben): Use a separate cache per URLRequestContext. 341 // TODO(davidben): Use a separate cache per URLRequestContext.
336 // https://crbug.com/458365 342 // https://crbug.com/458365
337 // 343 //
338 // TODO(davidben): Sessions should be invalidated on fatal 344 // TODO(davidben): Sessions should be invalidated on fatal
339 // alerts. https://crbug.com/466352 345 // alerts. https://crbug.com/466352
340 SSLClientSessionCacheOpenSSL session_cache_; 346 SSLClientSessionCacheOpenSSL session_cache_;
347 TokenBindingExtension token_binding_extension_;
mattm 2015/09/24 22:13:13 unused?
nharper 2015/09/28 21:43:39 It's used in several places below.
mattm 2015/09/28 23:07:25 Those all look like references to SSLClientSocketO
nharper 2015/09/28 23:18:33 Sorry, I didn't notice that this was in SSLContext
341 }; 348 };
342 349
343 const SSL_PRIVATE_KEY_METHOD 350 const SSL_PRIVATE_KEY_METHOD
344 SSLClientSocketOpenSSL::SSLContext::kPrivateKeyMethod = { 351 SSLClientSocketOpenSSL::SSLContext::kPrivateKeyMethod = {
345 &SSLClientSocketOpenSSL::SSLContext::PrivateKeyTypeCallback, 352 &SSLClientSocketOpenSSL::SSLContext::PrivateKeyTypeCallback,
346 &SSLClientSocketOpenSSL::SSLContext::PrivateKeySupportsDigestCallback, 353 &SSLClientSocketOpenSSL::SSLContext::PrivateKeySupportsDigestCallback,
347 &SSLClientSocketOpenSSL::SSLContext::PrivateKeyMaxSignatureLenCallback, 354 &SSLClientSocketOpenSSL::SSLContext::PrivateKeyMaxSignatureLenCallback,
348 &SSLClientSocketOpenSSL::SSLContext::PrivateKeySignCallback, 355 &SSLClientSocketOpenSSL::SSLContext::PrivateKeySignCallback,
349 &SSLClientSocketOpenSSL::SSLContext::PrivateKeySignCompleteCallback, 356 &SSLClientSocketOpenSSL::SSLContext::PrivateKeySignCompleteCallback,
350 }; 357 };
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 557
551 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT); 558 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT);
552 559
553 // Set up new ssl object. 560 // Set up new ssl object.
554 int rv = Init(); 561 int rv = Init();
555 if (rv != OK) { 562 if (rv != OK) {
556 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); 563 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
557 return rv; 564 return rv;
558 } 565 }
559 566
567 // Set params for TokenBindingExtension object.
568 if (IsTokenBindingEnabled(ssl_config_, channel_id_service_)) {
569 token_binding_extension_.SetParams(&ssl_config_.token_binding_params);
570 }
571
560 // Set SSL to client mode. Handshake happens in the loop below. 572 // Set SSL to client mode. Handshake happens in the loop below.
561 SSL_set_connect_state(ssl_); 573 SSL_set_connect_state(ssl_);
562 574
563 GotoState(STATE_HANDSHAKE); 575 GotoState(STATE_HANDSHAKE);
564 rv = DoHandshakeLoop(OK); 576 rv = DoHandshakeLoop(OK);
565 if (rv == ERR_IO_PENDING) { 577 if (rv == ERR_IO_PENDING) {
566 user_connect_callback_ = callback; 578 user_connect_callback_ = callback;
567 } else { 579 } else {
568 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); 580 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
569 } 581 }
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 ssl_info->cert = server_cert_verify_result_.verified_cert; 725 ssl_info->cert = server_cert_verify_result_.verified_cert;
714 ssl_info->unverified_cert = server_cert_; 726 ssl_info->unverified_cert = server_cert_;
715 ssl_info->cert_status = server_cert_verify_result_.cert_status; 727 ssl_info->cert_status = server_cert_verify_result_.cert_status;
716 ssl_info->is_issued_by_known_root = 728 ssl_info->is_issued_by_known_root =
717 server_cert_verify_result_.is_issued_by_known_root; 729 server_cert_verify_result_.is_issued_by_known_root;
718 ssl_info->public_key_hashes = 730 ssl_info->public_key_hashes =
719 server_cert_verify_result_.public_key_hashes; 731 server_cert_verify_result_.public_key_hashes;
720 ssl_info->client_cert_sent = 732 ssl_info->client_cert_sent =
721 ssl_config_.send_client_cert && ssl_config_.client_cert.get(); 733 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
722 ssl_info->channel_id_sent = channel_id_sent_; 734 ssl_info->channel_id_sent = channel_id_sent_;
735 ssl_info->token_binding_negotiated = token_binding_extension_.WasNegotiated();
723 ssl_info->pinning_failure_log = pinning_failure_log_; 736 ssl_info->pinning_failure_log = pinning_failure_log_;
724 737
725 AddSCTInfoToSSLInfo(ssl_info); 738 AddSCTInfoToSSLInfo(ssl_info);
726 739
727 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_); 740 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
728 CHECK(cipher); 741 CHECK(cipher);
729 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL); 742 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
730 ssl_info->key_exchange_info = 743 ssl_info->key_exchange_info =
731 SSL_SESSION_get_key_exchange_info(SSL_get_session(ssl_)); 744 SSL_SESSION_get_key_exchange_info(SSL_get_session(ssl_));
732 745
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 1115
1103 int SSLClientSocketOpenSSL::DoHandshakeComplete(int result) { 1116 int SSLClientSocketOpenSSL::DoHandshakeComplete(int result) {
1104 if (result < 0) 1117 if (result < 0)
1105 return result; 1118 return result;
1106 1119
1107 if (ssl_config_.version_fallback && 1120 if (ssl_config_.version_fallback &&
1108 ssl_config_.version_max < ssl_config_.version_fallback_min) { 1121 ssl_config_.version_max < ssl_config_.version_fallback_min) {
1109 return ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION; 1122 return ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION;
1110 } 1123 }
1111 1124
1125 // Check that if token binding was negotiated, then extended master secret
1126 // must also be negotiated.
1127 if (token_binding_extension_.WasNegotiated() &&
1128 !ssl_->session->extended_master_secret) {
1129 return ERR_SSL_PROTOCOL_ERROR;
1130 }
1131
1132 if (token_binding_extension_.WasNegotiated() && !channel_id_key_) {
1133 GotoState(STATE_TOKEN_BINDING_LOOKUP);
1134 return OK;
1135 }
1136
1112 // SSL handshake is completed. If NPN wasn't negotiated, see if ALPN was. 1137 // SSL handshake is completed. If NPN wasn't negotiated, see if ALPN was.
1113 if (npn_status_ == kNextProtoUnsupported) { 1138 if (npn_status_ == kNextProtoUnsupported) {
1114 const uint8_t* alpn_proto = NULL; 1139 const uint8_t* alpn_proto = NULL;
1115 unsigned alpn_len = 0; 1140 unsigned alpn_len = 0;
1116 SSL_get0_alpn_selected(ssl_, &alpn_proto, &alpn_len); 1141 SSL_get0_alpn_selected(ssl_, &alpn_proto, &alpn_len);
1117 if (alpn_len > 0) { 1142 if (alpn_len > 0) {
1118 npn_proto_.assign(reinterpret_cast<const char*>(alpn_proto), alpn_len); 1143 npn_proto_.assign(reinterpret_cast<const char*>(alpn_proto), alpn_len);
1119 npn_status_ = kNextProtoNegotiated; 1144 npn_status_ = kNextProtoNegotiated;
1120 set_negotiation_extension(kExtensionALPN); 1145 set_negotiation_extension(kExtensionALPN);
1121 } 1146 }
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 return MapOpenSSLError(err, err_tracer); 1205 return MapOpenSSLError(err, err_tracer);
1181 } 1206 }
1182 1207
1183 // Return to the handshake. 1208 // Return to the handshake.
1184 channel_id_sent_ = true; 1209 channel_id_sent_ = true;
1185 net_log_.AddEvent(NetLog::TYPE_SSL_CHANNEL_ID_PROVIDED); 1210 net_log_.AddEvent(NetLog::TYPE_SSL_CHANNEL_ID_PROVIDED);
1186 GotoState(STATE_HANDSHAKE); 1211 GotoState(STATE_HANDSHAKE);
1187 return OK; 1212 return OK;
1188 } 1213 }
1189 1214
1215 int SSLClientSocketOpenSSL::DoTokenBindingLookup() {
1216 net_log_.AddEvent(NetLog::TYPE_SSL_CHANNEL_ID_REQUESTED);
mattm 2015/09/24 22:13:12 (I'm not sure why the netlogging for channel id is
nharper 2015/09/28 21:43:38 (Both nss and openssl use TYPE_SSL_CHANNEL_ID_REQU
1217 GotoState(STATE_TOKEN_BINDING_LOOKUP_COMPLETE);
1218 return channel_id_service_->GetOrCreateChannelID(
1219 host_and_port_.host(), &channel_id_key_,
1220 base::Bind(&SSLClientSocketOpenSSL::OnHandshakeIOComplete,
1221 base::Unretained(this)),
1222 &channel_id_request_);
1223 }
1224
1225 int SSLClientSocketOpenSSL::DoTokenBindingLookupComplete(int result) {
1226 if (result < 0)
1227 return result;
1228
1229 if (!channel_id_key_) {
1230 LOG(ERROR) << "Failed to import Channel ID.";
1231 return ERR_CHANNEL_ID_IMPORT_FAILED;
1232 }
1233
1234 GotoState(STATE_HANDSHAKE_COMPLETE);
1235 return OK;
1236 }
1237
1190 int SSLClientSocketOpenSSL::DoVerifyCert(int result) { 1238 int SSLClientSocketOpenSSL::DoVerifyCert(int result) {
1191 DCHECK(!server_cert_chain_->empty()); 1239 DCHECK(!server_cert_chain_->empty());
1192 DCHECK(start_cert_verification_time_.is_null()); 1240 DCHECK(start_cert_verification_time_.is_null());
1193 1241
1194 GotoState(STATE_VERIFY_CERT_COMPLETE); 1242 GotoState(STATE_VERIFY_CERT_COMPLETE);
1195 1243
1196 // OpenSSL decoded the certificate, but the platform certificate 1244 // OpenSSL decoded the certificate, but the platform certificate
1197 // implementation could not. This is treated as a fatal SSL-level protocol 1245 // implementation could not. This is treated as a fatal SSL-level protocol
1198 // error rather than a certificate error. See https://crbug.com/91341. 1246 // error rather than a certificate error. See https://crbug.com/91341.
1199 if (!server_cert_.get()) 1247 if (!server_cert_.get())
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
1410 case STATE_HANDSHAKE_COMPLETE: 1458 case STATE_HANDSHAKE_COMPLETE:
1411 rv = DoHandshakeComplete(rv); 1459 rv = DoHandshakeComplete(rv);
1412 break; 1460 break;
1413 case STATE_CHANNEL_ID_LOOKUP: 1461 case STATE_CHANNEL_ID_LOOKUP:
1414 DCHECK_EQ(OK, rv); 1462 DCHECK_EQ(OK, rv);
1415 rv = DoChannelIDLookup(); 1463 rv = DoChannelIDLookup();
1416 break; 1464 break;
1417 case STATE_CHANNEL_ID_LOOKUP_COMPLETE: 1465 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1418 rv = DoChannelIDLookupComplete(rv); 1466 rv = DoChannelIDLookupComplete(rv);
1419 break; 1467 break;
1468 case STATE_TOKEN_BINDING_LOOKUP:
1469 DCHECK_EQ(OK, rv);
1470 rv = DoTokenBindingLookup();
1471 break;
1472 case STATE_TOKEN_BINDING_LOOKUP_COMPLETE:
1473 rv = DoTokenBindingLookupComplete(rv);
1474 break;
1420 case STATE_VERIFY_CERT: 1475 case STATE_VERIFY_CERT:
1421 DCHECK_EQ(OK, rv); 1476 DCHECK_EQ(OK, rv);
1422 rv = DoVerifyCert(rv); 1477 rv = DoVerifyCert(rv);
1423 break; 1478 break;
1424 case STATE_VERIFY_CERT_COMPLETE: 1479 case STATE_VERIFY_CERT_COMPLETE:
1425 rv = DoVerifyCertComplete(rv); 1480 rv = DoVerifyCertComplete(rv);
1426 break; 1481 break;
1427 case STATE_NONE: 1482 case STATE_NONE:
1428 default: 1483 default:
1429 rv = ERR_UNEXPECTED; 1484 rv = ERR_UNEXPECTED;
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after
2138 if (next_handshake_state_ == STATE_HANDSHAKE) { 2193 if (next_handshake_state_ == STATE_HANDSHAKE) {
2139 OnHandshakeIOComplete(signature_result_); 2194 OnHandshakeIOComplete(signature_result_);
2140 return; 2195 return;
2141 } 2196 }
2142 2197
2143 // During a renegotiation, either Read or Write calls may be blocked on an 2198 // During a renegotiation, either Read or Write calls may be blocked on an
2144 // asynchronous private key operation. 2199 // asynchronous private key operation.
2145 PumpReadWriteEvents(); 2200 PumpReadWriteEvents();
2146 } 2201 }
2147 2202
2203 TokenBindingExtension::TokenBindingExtension()
2204 : negotiated_(false), negotiated_param_(TokenBindingParam(0)) {}
2205
2206 TokenBindingExtension::~TokenBindingExtension() {}
2207
2208 bool TokenBindingExtension::WasNegotiated() const {
2209 return negotiated_;
2210 }
2211
2212 TokenBindingParam TokenBindingExtension::NegotiationResult() const {
2213 return negotiated_param_;
2214 };
2215
2216 void TokenBindingExtension::SetParams(std::vector<TokenBindingParam>* params) {
mattm 2015/09/24 22:13:12 take a const ref
nharper 2015/09/28 21:43:38 Done.
2217 supported_params_.clear();
2218 for (TokenBindingParam param : *params) {
2219 supported_params_.push_back(param);
2220 }
2221 };
2222
2223 // static
2224 int TokenBindingExtension::RegisterCallbacks(SSL_CTX* ssl_ctx) {
2225 return SSL_CTX_add_client_custom_ext(
2226 ssl_ctx, kExtNum, &TokenBindingExtension::ClientAddCallback,
2227 &TokenBindingExtension::ClientFreeCallback, nullptr,
2228 &TokenBindingExtension::ClientParseCallback, nullptr);
2229 }
2230
2231 int TokenBindingExtension::ClientAdd(SSL* s,
2232 unsigned int ext_type,
2233 const unsigned char** out,
davidben 2015/09/25 21:51:50 Nit: uint8_t
nharper 2015/09/28 21:43:39 Done. I've gone through and changed these signatur
2234 size_t* outlen,
2235 int* al) {
mattm 2015/09/24 22:13:12 al?
nharper 2015/09/28 21:43:39 out_alert_value. Renamed.
2236 if (supported_params_.empty()) {
2237 return 0;
2238 }
2239 if (ext_type != kExtNum) {
mattm 2015/09/24 22:13:12 I'm not familiar enough with the boringssl api her
davidben 2015/09/25 21:51:50 Yeah, I think DCHECK is right. It shouldn't be cal
nharper 2015/09/28 21:43:39 Done.
2240 return 0;
2241 }
2242 CBB output, parameters_list;
2243 int retval = 0;
2244 if (!CBB_init(&output, 7))
2245 goto end;
davidben 2015/09/25 21:51:50 Optional: Here's a scoper for you to save on the g
nharper 2015/09/28 21:43:39 Would it be appropriate to put this scoper in //cr
2246 if (!CBB_add_u8(&output, kProtocolVersionMajor) ||
2247 !CBB_add_u8(&output, kProtocolVersionMinor) ||
2248 !CBB_add_u8_length_prefixed(&output, &parameters_list)) {
2249 goto end;
2250 }
2251 for (size_t i = 0; i < supported_params_.size(); ++i) {
2252 if (!CBB_add_u8(&parameters_list, supported_params_[i])) {
2253 goto end;
2254 }
2255 }
2256 if (!CBB_finish(&output, const_cast<uint8_t**>(out), outlen))
2257 goto end;
2258
2259 retval = 1;
2260
2261 end:
2262 CBB_cleanup(&output);
2263 return retval;
2264 }
2265
2266 int TokenBindingExtension::ClientParse(SSL* s,
2267 unsigned int ext_type,
2268 const unsigned char* in,
davidben 2015/09/25 21:51:50 Nit: uint8_t
nharper 2015/09/28 21:43:39 Done.
2269 size_t inlen,
2270 int* al) {
2271 if (ext_type != kExtNum) {
2272 return 0;
2273 }
2274 CBS in_ext;
2275 CBS_init(&in_ext, in, inlen);
2276
2277 CBS parameters_list;
2278 uint8_t version_major, version_minor, param;
2279 if (!CBS_get_u8(&in_ext, &version_major) ||
2280 !CBS_get_u8(&in_ext, &version_minor) ||
2281 version_major != kProtocolVersionMajor ||
2282 version_minor != kProtocolVersionMinor ||
2283 !CBS_get_u8_length_prefixed(&in_ext, &parameters_list)) {
davidben 2015/09/25 21:51:50 Also reject CBS_len(&in_ext) != 0 to reject extra
nharper 2015/09/28 21:43:38 Done.
2284 return 0;
davidben 2015/09/25 21:51:50 *al = SSL_AD_DECODE_ERROR; (This is actually the
nharper 2015/09/28 21:43:38 Done.
2285 }
2286
2287 if (!CBS_get_u8(&parameters_list, &param))
2288 return 0;
davidben 2015/09/25 21:51:50 Optional: I would probably fold this line and the
nharper 2015/09/28 21:43:39 Done.
2289 bool valid_param = false;
2290 for (size_t i = 0; i < supported_params_.size(); ++i) {
2291 if (param == supported_params_[i]) {
2292 negotiated_param_ = TokenBindingParam(param);
2293 valid_param = true;
2294 break;
2295 }
2296 }
2297 if (CBS_len(&parameters_list) > 0 || !valid_param)
mattm 2015/09/24 22:13:12 Add a comment about why you don't need to check th
davidben 2015/09/25 21:51:50 If valid_param is false, we probably want to emit
davidben 2015/09/25 21:51:50 parameters_list is only ever supposed to have one
mattm 2015/09/25 22:01:30 Right, I just meant there should be a comment stat
nharper 2015/09/28 21:43:39 Done.
2298 return 0;
mattm 2015/09/24 22:13:12 Is setting an appropriate value to *al (out_alert_
davidben 2015/09/25 21:51:50 *al is only processed on failure, so it can be lef
mattm 2015/09/25 22:01:30 I was asking about the failure cases specifically,
davidben 2015/09/25 22:04:25 Right, sorry, misread that. :-)
2299 negotiated_ = true;
2300 return 1;
2301 }
2302
2303 // static
2304 int TokenBindingExtension::ClientAddCallback(SSL* s,
2305 unsigned int ext_type,
2306 const unsigned char** out,
2307 size_t* outlen,
2308 int* al,
2309 void* add_arg) {
2310 SSLClientSocketOpenSSL* socket =
2311 SSLClientSocketOpenSSL::SSLContext::GetInstance()->GetClientSocketFromSSL(
2312 s);
2313 return socket->token_binding_extension_.ClientAdd(s, ext_type, out, outlen,
2314 al);
2315 }
2316
2317 // static
2318 void TokenBindingExtension::ClientFreeCallback(SSL* s,
2319 unsigned ext_type,
2320 const unsigned char* out,
2321 void* add_arg) {
2322 OPENSSL_free(const_cast<unsigned char*>(out));
2323 }
2324
2325 // static
2326 int TokenBindingExtension::ClientParseCallback(SSL* s,
2327 unsigned int ext_type,
2328 const unsigned char* in,
2329 size_t inlen,
2330 int* al,
2331 void* parse_arg) {
2332 SSLClientSocketOpenSSL* socket =
2333 SSLClientSocketOpenSSL::SSLContext::GetInstance()->GetClientSocketFromSSL(
2334 s);
2335 return socket->token_binding_extension_.ClientParse(s, ext_type, in, inlen,
2336 al);
2337 }
2338
2148 } // namespace net 2339 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698