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

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

Issue 225005: Change the SSL Socket to be capable of having reads and... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « net/socket/ssl_client_socket_win.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2009 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 #include "net/socket/ssl_client_socket_win.h" 5 #include "net/socket/ssl_client_socket_win.h"
6 6
7 #include <schnlsp.h> 7 #include <schnlsp.h>
8 8
9 #include "base/compiler_specific.h"
9 #include "base/lock.h" 10 #include "base/lock.h"
10 #include "base/singleton.h" 11 #include "base/singleton.h"
11 #include "base/stl_util-inl.h" 12 #include "base/stl_util-inl.h"
12 #include "base/string_util.h" 13 #include "base/string_util.h"
13 #include "net/base/cert_verifier.h" 14 #include "net/base/cert_verifier.h"
14 #include "net/base/connection_type_histograms.h" 15 #include "net/base/connection_type_histograms.h"
15 #include "net/base/io_buffer.h" 16 #include "net/base/io_buffer.h"
16 #include "net/base/net_errors.h" 17 #include "net/base/net_errors.h"
17 #include "net/base/ssl_cert_request_info.h" 18 #include "net/base/ssl_cert_request_info.h"
18 #include "net/base/ssl_info.h" 19 #include "net/base/ssl_info.h"
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 // have room for a full SSL record, with the header and trailer. Here is the 282 // have room for a full SSL record, with the header and trailer. Here is the
282 // breakdown of the size: 283 // breakdown of the size:
283 // 5: SSL record header 284 // 5: SSL record header
284 // 16K: SSL record maximum size 285 // 16K: SSL record maximum size
285 // 64: >= SSL record trailer (16 or 20 have been observed) 286 // 64: >= SSL record trailer (16 or 20 have been observed)
286 static const int kRecvBufferSize = (5 + 16*1024 + 64); 287 static const int kRecvBufferSize = (5 + 16*1024 + 64);
287 288
288 SSLClientSocketWin::SSLClientSocketWin(ClientSocket* transport_socket, 289 SSLClientSocketWin::SSLClientSocketWin(ClientSocket* transport_socket,
289 const std::string& hostname, 290 const std::string& hostname,
290 const SSLConfig& ssl_config) 291 const SSLConfig& ssl_config)
291 #pragma warning(suppress: 4355) 292 : ALLOW_THIS_IN_INITIALIZER_LIST(
292 : io_callback_(this, &SSLClientSocketWin::OnIOComplete), 293 handshake_io_callback_(this,
294 &SSLClientSocketWin::OnHandshakeIOComplete)),
295 ALLOW_THIS_IN_INITIALIZER_LIST(
296 read_callback_(this, &SSLClientSocketWin::OnReadComplete)),
297 ALLOW_THIS_IN_INITIALIZER_LIST(
298 write_callback_(this, &SSLClientSocketWin::OnWriteComplete)),
293 transport_(transport_socket), 299 transport_(transport_socket),
294 hostname_(hostname), 300 hostname_(hostname),
295 ssl_config_(ssl_config), 301 ssl_config_(ssl_config),
296 user_callback_(NULL), 302 user_connect_callback_(NULL),
297 user_buf_len_(0), 303 user_read_callback_(NULL),
304 user_read_buf_len_(0),
305 user_write_callback_(NULL),
306 user_write_buf_len_(0),
298 next_state_(STATE_NONE), 307 next_state_(STATE_NONE),
299 creds_(NULL), 308 creds_(NULL),
300 isc_status_(SEC_E_OK), 309 isc_status_(SEC_E_OK),
301 payload_send_buffer_len_(0), 310 payload_send_buffer_len_(0),
302 bytes_sent_(0), 311 bytes_sent_(0),
303 decrypted_ptr_(NULL), 312 decrypted_ptr_(NULL),
304 bytes_decrypted_(0), 313 bytes_decrypted_(0),
305 received_ptr_(NULL), 314 received_ptr_(NULL),
306 bytes_received_(0), 315 bytes_received_(0),
307 writing_first_token_(false), 316 writing_first_token_(false),
308 completed_handshake_(false),
309 ignore_ok_result_(false), 317 ignore_ok_result_(false),
310 renegotiating_(false) { 318 renegotiating_(false),
319 need_more_data_(false) {
311 memset(&stream_sizes_, 0, sizeof(stream_sizes_)); 320 memset(&stream_sizes_, 0, sizeof(stream_sizes_));
312 memset(in_buffers_, 0, sizeof(in_buffers_)); 321 memset(in_buffers_, 0, sizeof(in_buffers_));
313 memset(&send_buffer_, 0, sizeof(send_buffer_)); 322 memset(&send_buffer_, 0, sizeof(send_buffer_));
314 memset(&ctxt_, 0, sizeof(ctxt_)); 323 memset(&ctxt_, 0, sizeof(ctxt_));
315 } 324 }
316 325
317 SSLClientSocketWin::~SSLClientSocketWin() { 326 SSLClientSocketWin::~SSLClientSocketWin() {
318 Disconnect(); 327 Disconnect();
319 } 328 }
320 329
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 411
403 FreeContextBuffer(issuer_list.aIssuers); 412 FreeContextBuffer(issuer_list.aIssuers);
404 413
405 BOOL ok = CertCloseStore(my_cert_store, CERT_CLOSE_STORE_CHECK_FLAG); 414 BOOL ok = CertCloseStore(my_cert_store, CERT_CLOSE_STORE_CHECK_FLAG);
406 DCHECK(ok); 415 DCHECK(ok);
407 } 416 }
408 417
409 int SSLClientSocketWin::Connect(CompletionCallback* callback) { 418 int SSLClientSocketWin::Connect(CompletionCallback* callback) {
410 DCHECK(transport_.get()); 419 DCHECK(transport_.get());
411 DCHECK(next_state_ == STATE_NONE); 420 DCHECK(next_state_ == STATE_NONE);
412 DCHECK(!user_callback_); 421 DCHECK(!user_connect_callback_);
413 422
414 int ssl_version_mask = 0; 423 int ssl_version_mask = 0;
415 if (ssl_config_.ssl2_enabled) 424 if (ssl_config_.ssl2_enabled)
416 ssl_version_mask |= SSL2; 425 ssl_version_mask |= SSL2;
417 if (ssl_config_.ssl3_enabled) 426 if (ssl_config_.ssl3_enabled)
418 ssl_version_mask |= SSL3; 427 ssl_version_mask |= SSL3;
419 if (ssl_config_.tls1_enabled) 428 if (ssl_config_.tls1_enabled)
420 ssl_version_mask |= TLS1; 429 ssl_version_mask |= TLS1;
421 // If we pass 0 to GetCredHandle, we will let Schannel select the protocols, 430 // If we pass 0 to GetCredHandle, we will let Schannel select the protocols,
422 // rather than enabling no protocols. So we have to fail here. 431 // rather than enabling no protocols. So we have to fail here.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 &expiry); 473 &expiry);
465 if (status != SEC_I_CONTINUE_NEEDED) { 474 if (status != SEC_I_CONTINUE_NEEDED) {
466 DLOG(ERROR) << "InitializeSecurityContext failed: " << status; 475 DLOG(ERROR) << "InitializeSecurityContext failed: " << status;
467 return MapSecurityError(status); 476 return MapSecurityError(status);
468 } 477 }
469 478
470 writing_first_token_ = true; 479 writing_first_token_ = true;
471 next_state_ = STATE_HANDSHAKE_WRITE; 480 next_state_ = STATE_HANDSHAKE_WRITE;
472 int rv = DoLoop(OK); 481 int rv = DoLoop(OK);
473 if (rv == ERR_IO_PENDING) 482 if (rv == ERR_IO_PENDING)
474 user_callback_ = callback; 483 user_connect_callback_ = callback;
475 return rv; 484 return rv;
476 } 485 }
477 486
478 void SSLClientSocketWin::Disconnect() { 487 void SSLClientSocketWin::Disconnect() {
479 // TODO(wtc): Send SSL close_notify alert. 488 // TODO(wtc): Send SSL close_notify alert.
480 completed_handshake_ = false; 489 next_state_ = STATE_NONE;
481 // Shut down anything that may call us back through io_callback_. 490
491 // Shut down anything that may call us back.
482 verifier_.reset(); 492 verifier_.reset();
483 transport_->Disconnect(); 493 transport_->Disconnect();
484 494
485 if (send_buffer_.pvBuffer) 495 if (send_buffer_.pvBuffer)
486 FreeSendBuffer(); 496 FreeSendBuffer();
487 if (ctxt_.dwLower || ctxt_.dwUpper) { 497 if (ctxt_.dwLower || ctxt_.dwUpper) {
488 DeleteSecurityContext(&ctxt_); 498 DeleteSecurityContext(&ctxt_);
489 memset(&ctxt_, 0, sizeof(ctxt_)); 499 memset(&ctxt_, 0, sizeof(ctxt_));
490 } 500 }
491 if (server_cert_) 501 if (server_cert_)
492 server_cert_ = NULL; 502 server_cert_ = NULL;
493 503
494 // TODO(wtc): reset more members? 504 // TODO(wtc): reset more members?
495 bytes_decrypted_ = 0; 505 bytes_decrypted_ = 0;
496 bytes_received_ = 0; 506 bytes_received_ = 0;
497 writing_first_token_ = false; 507 writing_first_token_ = false;
498 renegotiating_ = false; 508 renegotiating_ = false;
509 need_more_data_ = false;
499 } 510 }
500 511
501 bool SSLClientSocketWin::IsConnected() const { 512 bool SSLClientSocketWin::IsConnected() const {
502 // Ideally, we should also check if we have received the close_notify alert 513 // Ideally, we should also check if we have received the close_notify alert
503 // message from the server, and return false in that case. We're not doing 514 // message from the server, and return false in that case. We're not doing
504 // that, so this function may return a false positive. Since the upper 515 // that, so this function may return a false positive. Since the upper
505 // layer (HttpNetworkTransaction) needs to handle a persistent connection 516 // layer (HttpNetworkTransaction) needs to handle a persistent connection
506 // closed by the server when we send a request anyway, a false positive in 517 // closed by the server when we send a request anyway, a false positive in
507 // exchange for simpler code is a good trade-off. 518 // exchange for simpler code is a good trade-off.
508 return completed_handshake_ && transport_->IsConnected(); 519 return completed_handshake() && transport_->IsConnected();
509 } 520 }
510 521
511 bool SSLClientSocketWin::IsConnectedAndIdle() const { 522 bool SSLClientSocketWin::IsConnectedAndIdle() const {
512 // Unlike IsConnected, this method doesn't return a false positive. 523 // Unlike IsConnected, this method doesn't return a false positive.
513 // 524 //
514 // Strictly speaking, we should check if we have received the close_notify 525 // Strictly speaking, we should check if we have received the close_notify
515 // alert message from the server, and return false in that case. Although 526 // alert message from the server, and return false in that case. Although
516 // the close_notify alert message means EOF in the SSL layer, it is just 527 // the close_notify alert message means EOF in the SSL layer, it is just
517 // bytes to the transport layer below, so transport_->IsConnectedAndIdle() 528 // bytes to the transport layer below, so transport_->IsConnectedAndIdle()
518 // returns the desired false when we receive close_notify. 529 // returns the desired false when we receive close_notify.
519 return completed_handshake_ && transport_->IsConnectedAndIdle(); 530 return completed_handshake() && transport_->IsConnectedAndIdle();
520 } 531 }
521 532
522 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len, 533 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len,
523 CompletionCallback* callback) { 534 CompletionCallback* callback) {
524 DCHECK(completed_handshake_); 535 DCHECK(completed_handshake());
525 DCHECK(next_state_ == STATE_NONE); 536 DCHECK(!user_read_callback_);
526 DCHECK(!user_callback_);
527 537
528 // If we have surplus decrypted plaintext, satisfy the Read with it without 538 // If we have surplus decrypted plaintext, satisfy the Read with it without
529 // reading more ciphertext from the transport socket. 539 // reading more ciphertext from the transport socket.
530 if (bytes_decrypted_ != 0) { 540 if (bytes_decrypted_ != 0) {
531 int len = std::min(buf_len, bytes_decrypted_); 541 int len = std::min(buf_len, bytes_decrypted_);
532 memcpy(buf->data(), decrypted_ptr_, len); 542 memcpy(buf->data(), decrypted_ptr_, len);
533 decrypted_ptr_ += len; 543 decrypted_ptr_ += len;
534 bytes_decrypted_ -= len; 544 bytes_decrypted_ -= len;
535 if (bytes_decrypted_ == 0) { 545 if (bytes_decrypted_ == 0) {
536 decrypted_ptr_ = NULL; 546 decrypted_ptr_ = NULL;
537 if (bytes_received_ != 0) { 547 if (bytes_received_ != 0) {
538 memmove(recv_buffer_.get(), received_ptr_, bytes_received_); 548 memmove(recv_buffer_.get(), received_ptr_, bytes_received_);
539 received_ptr_ = recv_buffer_.get(); 549 received_ptr_ = recv_buffer_.get();
540 } 550 }
541 } 551 }
542 return len; 552 return len;
543 } 553 }
544 554
545 DCHECK(!user_buf_); 555 DCHECK(!user_read_buf_);
546 // http://crbug.com/16371: We're seeing |buf->data()| return NULL. See if the 556 // http://crbug.com/16371: We're seeing |buf->data()| return NULL. See if the
547 // user is passing in an IOBuffer with a NULL |data_|. 557 // user is passing in an IOBuffer with a NULL |data_|.
548 CHECK(buf); 558 CHECK(buf);
549 CHECK(buf->data()); 559 CHECK(buf->data());
550 user_buf_ = buf; 560 user_read_buf_ = buf;
551 user_buf_len_ = buf_len; 561 user_read_buf_len_ = buf_len;
552 562
553 SetNextStateForRead(); 563 int rv = DoPayloadRead();
554 int rv = DoLoop(OK);
555 if (rv == ERR_IO_PENDING) { 564 if (rv == ERR_IO_PENDING) {
556 user_callback_ = callback; 565 user_read_callback_ = callback;
557 } else { 566 } else {
558 user_buf_ = NULL; 567 user_read_buf_ = NULL;
568 user_read_buf_len_ = 0;
559 } 569 }
560 return rv; 570 return rv;
561 } 571 }
562 572
563 int SSLClientSocketWin::Write(IOBuffer* buf, int buf_len, 573 int SSLClientSocketWin::Write(IOBuffer* buf, int buf_len,
564 CompletionCallback* callback) { 574 CompletionCallback* callback) {
565 DCHECK(completed_handshake_); 575 DCHECK(completed_handshake());
566 DCHECK(next_state_ == STATE_NONE); 576 DCHECK(!user_write_callback_);
567 DCHECK(!user_callback_);
568 577
569 DCHECK(!user_buf_); 578 DCHECK(!user_write_buf_);
570 user_buf_ = buf; 579 user_write_buf_ = buf;
571 user_buf_len_ = buf_len; 580 user_write_buf_len_ = buf_len;
572 581
573 next_state_ = STATE_PAYLOAD_ENCRYPT; 582 int rv = DoPayloadEncrypt();
574 int rv = DoLoop(OK); 583 if (rv != OK)
584 return rv;
585
586 rv = DoPayloadWrite();
575 if (rv == ERR_IO_PENDING) { 587 if (rv == ERR_IO_PENDING) {
576 user_callback_ = callback; 588 user_write_callback_ = callback;
577 } else { 589 } else {
578 user_buf_ = NULL; 590 user_write_buf_ = NULL;
591 user_write_buf_len_ = 0;
579 } 592 }
580 return rv; 593 return rv;
581 } 594 }
582 595
583 bool SSLClientSocketWin::SetReceiveBufferSize(int32 size) { 596 bool SSLClientSocketWin::SetReceiveBufferSize(int32 size) {
584 return transport_->SetReceiveBufferSize(size); 597 return transport_->SetReceiveBufferSize(size);
585 } 598 }
586 599
587 bool SSLClientSocketWin::SetSendBufferSize(int32 size) { 600 bool SSLClientSocketWin::SetSendBufferSize(int32 size) {
588 return transport_->SetSendBufferSize(size); 601 return transport_->SetSendBufferSize(size);
589 } 602 }
590 603
591 void SSLClientSocketWin::DoCallback(int rv) { 604 void SSLClientSocketWin::OnHandshakeIOComplete(int result) {
592 DCHECK(rv != ERR_IO_PENDING); 605 int rv = DoLoop(result);
593 DCHECK(user_callback_);
594 606
595 // since Run may result in Read being called, clear user_callback_ up front. 607 // The SSL handshake has some round trips. Any error, other than waiting
596 CompletionCallback* c = user_callback_; 608 // for IO, means that we've failed and need to notify the caller.
597 user_callback_ = NULL; 609 if (rv != ERR_IO_PENDING) {
598 user_buf_ = NULL; 610 // If there is no connect callback available to call, it had better be
599 c->Run(rv); 611 // because we are renegotiating (which occurs because we are in the middle
612 // of a Read when the renegotiation process starts). We need to inform the
613 // caller of the SSL error, so we complete the Read here.
614 if (!user_connect_callback_) {
615 DCHECK(renegotiating_);
616 CompletionCallback* c = user_read_callback_;
617 user_read_callback_ = NULL;
618 user_read_buf_ = NULL;
619 user_read_buf_len_ = 0;
620 c->Run(rv);
621 return;
622 }
623 CompletionCallback* c = user_connect_callback_;
624 user_connect_callback_ = NULL;
625 c->Run(rv);
626 }
600 } 627 }
601 628
602 void SSLClientSocketWin::OnIOComplete(int result) { 629 void SSLClientSocketWin::OnReadComplete(int result) {
603 int rv = DoLoop(result); 630 DCHECK(completed_handshake());
604 if (rv != ERR_IO_PENDING) 631
605 DoCallback(rv); 632 result = DoPayloadReadComplete(result);
633 if (result > 0)
634 result = DoPayloadDecrypt();
635 if (result != ERR_IO_PENDING) {
636 DCHECK(user_read_callback_);
637 CompletionCallback* c = user_read_callback_;
638 user_read_callback_ = NULL;
639 user_read_buf_ = NULL;
640 user_read_buf_len_ = 0;
641 c->Run(result);
642 }
606 } 643 }
607 644
645 void SSLClientSocketWin::OnWriteComplete(int result) {
646 DCHECK(completed_handshake());
647
648 int rv = DoPayloadWriteComplete(result);
649 if (rv != ERR_IO_PENDING) {
650 DCHECK(user_write_callback_);
651 CompletionCallback* c = user_write_callback_;
652 user_write_callback_ = NULL;
653 user_write_buf_ = NULL;
654 user_write_buf_len_ = 0;
655 c->Run(rv);
656 }
657 }
658
659
608 int SSLClientSocketWin::DoLoop(int last_io_result) { 660 int SSLClientSocketWin::DoLoop(int last_io_result) {
609 DCHECK(next_state_ != STATE_NONE); 661 DCHECK(next_state_ != STATE_NONE);
610 int rv = last_io_result; 662 int rv = last_io_result;
611 do { 663 do {
612 State state = next_state_; 664 State state = next_state_;
613 next_state_ = STATE_NONE; 665 next_state_ = STATE_NONE;
614 switch (state) { 666 switch (state) {
615 case STATE_HANDSHAKE_READ: 667 case STATE_HANDSHAKE_READ:
616 rv = DoHandshakeRead(); 668 rv = DoHandshakeRead();
617 break; 669 break;
618 case STATE_HANDSHAKE_READ_COMPLETE: 670 case STATE_HANDSHAKE_READ_COMPLETE:
619 rv = DoHandshakeReadComplete(rv); 671 rv = DoHandshakeReadComplete(rv);
620 break; 672 break;
621 case STATE_HANDSHAKE_WRITE: 673 case STATE_HANDSHAKE_WRITE:
622 rv = DoHandshakeWrite(); 674 rv = DoHandshakeWrite();
623 break; 675 break;
624 case STATE_HANDSHAKE_WRITE_COMPLETE: 676 case STATE_HANDSHAKE_WRITE_COMPLETE:
625 rv = DoHandshakeWriteComplete(rv); 677 rv = DoHandshakeWriteComplete(rv);
626 break; 678 break;
627 case STATE_VERIFY_CERT: 679 case STATE_VERIFY_CERT:
628 rv = DoVerifyCert(); 680 rv = DoVerifyCert();
629 break; 681 break;
630 case STATE_VERIFY_CERT_COMPLETE: 682 case STATE_VERIFY_CERT_COMPLETE:
631 rv = DoVerifyCertComplete(rv); 683 rv = DoVerifyCertComplete(rv);
632 break; 684 break;
633 case STATE_PAYLOAD_READ: 685 case STATE_COMPLETED_RENEGOTIATION:
634 rv = DoPayloadRead(); 686 rv = DoCompletedRenegotiation(rv);
635 break; 687 break;
636 case STATE_PAYLOAD_READ_COMPLETE: 688 case STATE_COMPLETED_HANDSHAKE:
637 rv = DoPayloadReadComplete(rv); 689 next_state_ = STATE_COMPLETED_HANDSHAKE;
638 break; 690 // This is the end of our state machine, so return.
639 case STATE_PAYLOAD_ENCRYPT: 691 return rv;
640 rv = DoPayloadEncrypt();
641 break;
642 case STATE_PAYLOAD_WRITE:
643 rv = DoPayloadWrite();
644 break;
645 case STATE_PAYLOAD_WRITE_COMPLETE:
646 rv = DoPayloadWriteComplete(rv);
647 break;
648 default: 692 default:
649 rv = ERR_UNEXPECTED; 693 rv = ERR_UNEXPECTED;
650 NOTREACHED() << "unexpected state"; 694 NOTREACHED() << "unexpected state";
651 break; 695 break;
652 } 696 }
653 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); 697 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE);
654 return rv; 698 return rv;
655 } 699 }
656 700
657 int SSLClientSocketWin::DoHandshakeRead() { 701 int SSLClientSocketWin::DoHandshakeRead() {
658 next_state_ = STATE_HANDSHAKE_READ_COMPLETE; 702 next_state_ = STATE_HANDSHAKE_READ_COMPLETE;
659 703
660 if (!recv_buffer_.get()) 704 if (!recv_buffer_.get())
661 recv_buffer_.reset(new char[kRecvBufferSize]); 705 recv_buffer_.reset(new char[kRecvBufferSize]);
662 706
663 int buf_len = kRecvBufferSize - bytes_received_; 707 int buf_len = kRecvBufferSize - bytes_received_;
664 708
665 if (buf_len <= 0) { 709 if (buf_len <= 0) {
666 NOTREACHED() << "Receive buffer is too small!"; 710 NOTREACHED() << "Receive buffer is too small!";
667 return ERR_UNEXPECTED; 711 return ERR_UNEXPECTED;
668 } 712 }
669 713
670 DCHECK(!transport_buf_); 714 DCHECK(!transport_read_buf_);
671 transport_buf_ = new IOBuffer(buf_len); 715 transport_read_buf_ = new IOBuffer(buf_len);
672 716
673 return transport_->Read(transport_buf_, buf_len, &io_callback_); 717 return transport_->Read(transport_read_buf_, buf_len,
718 &handshake_io_callback_);
674 } 719 }
675 720
676 int SSLClientSocketWin::DoHandshakeReadComplete(int result) { 721 int SSLClientSocketWin::DoHandshakeReadComplete(int result) {
677 if (result < 0) { 722 if (result < 0) {
678 transport_buf_ = NULL; 723 transport_read_buf_ = NULL;
679 return result; 724 return result;
680 } 725 }
681 726
682 if (transport_buf_) { 727 if (transport_read_buf_) {
683 // A transition to STATE_HANDSHAKE_READ_COMPLETE is set in multiple places, 728 // A transition to STATE_HANDSHAKE_READ_COMPLETE is set in multiple places,
684 // not only in DoHandshakeRead(), so we may not have a transport_buf_. 729 // not only in DoHandshakeRead(), so we may not have a transport_read_buf_.
685 DCHECK_LE(result, kRecvBufferSize - bytes_received_); 730 DCHECK_LE(result, kRecvBufferSize - bytes_received_);
686 char* buf = recv_buffer_.get() + bytes_received_; 731 char* buf = recv_buffer_.get() + bytes_received_;
687 memcpy(buf, transport_buf_->data(), result); 732 memcpy(buf, transport_read_buf_->data(), result);
688 transport_buf_ = NULL; 733 transport_read_buf_ = NULL;
689 } 734 }
690 735
691 if (result == 0 && !ignore_ok_result_) 736 if (result == 0 && !ignore_ok_result_)
692 return ERR_SSL_PROTOCOL_ERROR; // Incomplete response :( 737 return ERR_SSL_PROTOCOL_ERROR; // Incomplete response :(
693 738
694 ignore_ok_result_ = false; 739 ignore_ok_result_ = false;
695 740
696 bytes_received_ += result; 741 bytes_received_ += result;
697 742
698 // Process the contents of recv_buffer_. 743 // Process the contents of recv_buffer_.
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 next_state_ = STATE_HANDSHAKE_READ; 854 next_state_ = STATE_HANDSHAKE_READ;
810 return OK; 855 return OK;
811 } 856 }
812 857
813 int SSLClientSocketWin::DoHandshakeWrite() { 858 int SSLClientSocketWin::DoHandshakeWrite() {
814 next_state_ = STATE_HANDSHAKE_WRITE_COMPLETE; 859 next_state_ = STATE_HANDSHAKE_WRITE_COMPLETE;
815 860
816 // We should have something to send. 861 // We should have something to send.
817 DCHECK(send_buffer_.pvBuffer); 862 DCHECK(send_buffer_.pvBuffer);
818 DCHECK(send_buffer_.cbBuffer > 0); 863 DCHECK(send_buffer_.cbBuffer > 0);
819 DCHECK(!transport_buf_); 864 DCHECK(!transport_write_buf_);
820 865
821 const char* buf = static_cast<char*>(send_buffer_.pvBuffer) + bytes_sent_; 866 const char* buf = static_cast<char*>(send_buffer_.pvBuffer) + bytes_sent_;
822 int buf_len = send_buffer_.cbBuffer - bytes_sent_; 867 int buf_len = send_buffer_.cbBuffer - bytes_sent_;
823 transport_buf_ = new IOBuffer(buf_len); 868 transport_write_buf_ = new IOBuffer(buf_len);
824 memcpy(transport_buf_->data(), buf, buf_len); 869 memcpy(transport_write_buf_->data(), buf, buf_len);
825 870
826 return transport_->Write(transport_buf_, buf_len, &io_callback_); 871 return transport_->Write(transport_write_buf_, buf_len,
872 &handshake_io_callback_);
827 } 873 }
828 874
829 int SSLClientSocketWin::DoHandshakeWriteComplete(int result) { 875 int SSLClientSocketWin::DoHandshakeWriteComplete(int result) {
830 DCHECK(transport_buf_); 876 DCHECK(transport_write_buf_);
831 transport_buf_ = NULL; 877 transport_write_buf_ = NULL;
832 if (result < 0) 878 if (result < 0)
833 return result; 879 return result;
834 880
835 DCHECK(result != 0); 881 DCHECK(result != 0);
836 882
837 bytes_sent_ += result; 883 bytes_sent_ += result;
838 DCHECK(bytes_sent_ <= static_cast<int>(send_buffer_.cbBuffer)); 884 DCHECK(bytes_sent_ <= static_cast<int>(send_buffer_.cbBuffer));
839 885
840 if (bytes_sent_ >= static_cast<int>(send_buffer_.cbBuffer)) { 886 if (bytes_sent_ >= static_cast<int>(send_buffer_.cbBuffer)) {
841 bool overflow = (bytes_sent_ > static_cast<int>(send_buffer_.cbBuffer)); 887 bool overflow = (bytes_sent_ > static_cast<int>(send_buffer_.cbBuffer));
(...skipping 21 matching lines...) Expand all
863 909
864 DCHECK(server_cert_); 910 DCHECK(server_cert_);
865 911
866 int flags = 0; 912 int flags = 0;
867 if (ssl_config_.rev_checking_enabled) 913 if (ssl_config_.rev_checking_enabled)
868 flags |= X509Certificate::VERIFY_REV_CHECKING_ENABLED; 914 flags |= X509Certificate::VERIFY_REV_CHECKING_ENABLED;
869 if (ssl_config_.verify_ev_cert) 915 if (ssl_config_.verify_ev_cert)
870 flags |= X509Certificate::VERIFY_EV_CERT; 916 flags |= X509Certificate::VERIFY_EV_CERT;
871 verifier_.reset(new CertVerifier); 917 verifier_.reset(new CertVerifier);
872 return verifier_->Verify(server_cert_, hostname_, flags, 918 return verifier_->Verify(server_cert_, hostname_, flags,
873 &server_cert_verify_result_, &io_callback_); 919 &server_cert_verify_result_,
920 &handshake_io_callback_);
874 } 921 }
875 922
876 int SSLClientSocketWin::DoVerifyCertComplete(int result) { 923 int SSLClientSocketWin::DoVerifyCertComplete(int result) {
877 DCHECK(verifier_.get()); 924 DCHECK(verifier_.get());
878 verifier_.reset(); 925 verifier_.reset();
879 926
880 // If we have been explicitly told to accept this certificate, override the 927 // If we have been explicitly told to accept this certificate, override the
881 // result of verifier_.Verify. 928 // result of verifier_.Verify.
882 // Eventually, we should cache the cert verification results so that we don't 929 // Eventually, we should cache the cert verification results so that we don't
883 // need to call verifier_.Verify repeatedly. But for now we need to do this. 930 // need to call verifier_.Verify repeatedly. But for now we need to do this.
884 // Alternatively, we could use the cert's status that we stored along with 931 // Alternatively, we could use the cert's status that we stored along with
885 // the cert in the allowed_bad_certs vector. 932 // the cert in the allowed_bad_certs vector.
886 if (IsCertificateError(result) && 933 if (IsCertificateError(result) &&
887 ssl_config_.IsAllowedBadCert(server_cert_)) 934 ssl_config_.IsAllowedBadCert(server_cert_))
888 result = OK; 935 result = OK;
889 936
890 LogConnectionTypeMetrics(); 937 LogConnectionTypeMetrics();
891 if (renegotiating_) { 938 if (renegotiating_) {
892 DidCompleteRenegotiation(result); 939 DidCompleteRenegotiation();
893 } else { 940 return result;
894 // The initial handshake, kicked off by a Connect, has completed.
895 completed_handshake_ = true;
896 // Exit DoLoop and return the result to the caller of Connect.
897 DCHECK(next_state_ == STATE_NONE);
898 } 941 }
942
943 // The initial handshake has completed.
944 next_state_ = STATE_COMPLETED_HANDSHAKE;
899 return result; 945 return result;
900 } 946 }
901 947
902 int SSLClientSocketWin::DoPayloadRead() { 948 int SSLClientSocketWin::DoPayloadRead() {
903 next_state_ = STATE_PAYLOAD_READ_COMPLETE;
904
905 DCHECK(recv_buffer_.get()); 949 DCHECK(recv_buffer_.get());
906 950
907 int buf_len = kRecvBufferSize - bytes_received_; 951 int buf_len = kRecvBufferSize - bytes_received_;
908 952
909 if (buf_len <= 0) { 953 if (buf_len <= 0) {
910 NOTREACHED() << "Receive buffer is too small!"; 954 NOTREACHED() << "Receive buffer is too small!";
911 return ERR_FAILED; 955 return ERR_FAILED;
912 } 956 }
913 957
914 DCHECK(!transport_buf_); 958 int rv;
915 transport_buf_ = new IOBuffer(buf_len); 959 // If bytes_received_, we have some data from a previous read still ready
960 // for decoding. Otherwise, we need to issue a real read.
961 if (!bytes_received_ || need_more_data_) {
962 DCHECK(!transport_read_buf_);
963 transport_read_buf_ = new IOBuffer(buf_len);
916 964
917 return transport_->Read(transport_buf_, buf_len, &io_callback_); 965 rv = transport_->Read(transport_read_buf_, buf_len, &read_callback_);
966 if (rv != ERR_IO_PENDING)
967 rv = DoPayloadReadComplete(rv);
968 if (rv <= 0)
969 return rv;
970 }
971
972 // Decode what we've read. If there is not enough data to decode yet,
973 // this may return ERR_IO_PENDING still.
974 return DoPayloadDecrypt();
918 } 975 }
919 976
977 // result is the number of bytes that have been read; it should not be
978 // less than zero; a value of zero means that no additional bytes have
979 // been read.
920 int SSLClientSocketWin::DoPayloadReadComplete(int result) { 980 int SSLClientSocketWin::DoPayloadReadComplete(int result) {
921 if (result < 0) { 981 DCHECK(completed_handshake());
922 transport_buf_ = NULL; 982
983 // If IO Pending, there is nothing to do here.
984 if (result == ERR_IO_PENDING)
985 return result;
986
987 // We completed a Read, so reset the need_more_data_ flag.
988 need_more_data_ = false;
989
990 // Check for error
991 if (result <= 0) {
992 transport_read_buf_ = NULL;
993 if (result == 0 && bytes_received_ != 0) {
994 // TODO(wtc): Unless we have received the close_notify alert, we need
995 // to return an error code indicating that the SSL connection ended
996 // uncleanly, a potential truncation attack. See
997 // http://crbug.com/18586.
998 return ERR_SSL_PROTOCOL_ERROR;
999 }
923 return result; 1000 return result;
924 } 1001 }
925 if (transport_buf_) { 1002
926 // This method is called after a state transition following DoPayloadRead(), 1003 // Transfer the data from transport_read_buf_ to recv_buffer_.
927 // or if SetNextStateForRead() was called. We have a transport_buf_ only 1004 if (transport_read_buf_) {
928 // in the first case, and we have to transfer the data from transport_buf_
929 // to recv_buffer_.
930 DCHECK_LE(result, kRecvBufferSize - bytes_received_); 1005 DCHECK_LE(result, kRecvBufferSize - bytes_received_);
931 char* buf = recv_buffer_.get() + bytes_received_; 1006 char* buf = recv_buffer_.get() + bytes_received_;
932 memcpy(buf, transport_buf_->data(), result); 1007 memcpy(buf, transport_read_buf_->data(), result);
933 transport_buf_ = NULL; 1008 transport_read_buf_ = NULL;
934 } 1009 }
935 1010
936 if (result == 0 && !ignore_ok_result_) {
937 // TODO(wtc): Unless we have received the close_notify alert, we need to
938 // return an error code indicating that the SSL connection ended
939 // uncleanly, a potential truncation attack. See http://crbug.com/18586.
940 if (bytes_received_ != 0)
941 return ERR_SSL_PROTOCOL_ERROR;
942 return OK;
943 }
944
945 ignore_ok_result_ = false;
946
947 bytes_received_ += result; 1011 bytes_received_ += result;
948 1012
1013 return result;
1014 }
1015
1016 int SSLClientSocketWin::DoPayloadDecrypt() {
949 // Process the contents of recv_buffer_. 1017 // Process the contents of recv_buffer_.
950 SecBuffer buffers[4]; 1018 int len = 0; // the number of bytes we've copied to the user buffer.
951 buffers[0].pvBuffer = recv_buffer_.get(); 1019 while (bytes_received_) {
952 buffers[0].cbBuffer = bytes_received_; 1020 SecBuffer buffers[4];
953 buffers[0].BufferType = SECBUFFER_DATA; 1021 buffers[0].pvBuffer = recv_buffer_.get();
1022 buffers[0].cbBuffer = bytes_received_;
1023 buffers[0].BufferType = SECBUFFER_DATA;
954 1024
955 buffers[1].BufferType = SECBUFFER_EMPTY; 1025 buffers[1].BufferType = SECBUFFER_EMPTY;
956 buffers[2].BufferType = SECBUFFER_EMPTY; 1026 buffers[2].BufferType = SECBUFFER_EMPTY;
957 buffers[3].BufferType = SECBUFFER_EMPTY; 1027 buffers[3].BufferType = SECBUFFER_EMPTY;
958 1028
959 SecBufferDesc buffer_desc; 1029 SecBufferDesc buffer_desc;
960 buffer_desc.cBuffers = 4; 1030 buffer_desc.cBuffers = 4;
961 buffer_desc.pBuffers = buffers; 1031 buffer_desc.pBuffers = buffers;
962 buffer_desc.ulVersion = SECBUFFER_VERSION; 1032 buffer_desc.ulVersion = SECBUFFER_VERSION;
963 1033
964 SECURITY_STATUS status; 1034 SECURITY_STATUS status;
965 status = DecryptMessage(&ctxt_, &buffer_desc, 0, NULL); 1035 status = DecryptMessage(&ctxt_, &buffer_desc, 0, NULL);
966 1036
967 if (status == SEC_E_INCOMPLETE_MESSAGE) { 1037 if (status == SEC_E_INCOMPLETE_MESSAGE) {
968 next_state_ = STATE_PAYLOAD_READ; 1038 need_more_data_ = true;
969 return OK; 1039 return DoPayloadRead();
970 } 1040 }
971 1041
972 if (status == SEC_I_CONTEXT_EXPIRED) { 1042 if (status == SEC_I_CONTEXT_EXPIRED) {
973 // Received the close_notify alert. 1043 // Received the close_notify alert.
1044 bytes_received_ = 0;
1045 return OK;
1046 }
1047
1048 if (status != SEC_E_OK && status != SEC_I_RENEGOTIATE) {
1049 DCHECK(status != SEC_E_MESSAGE_ALTERED);
1050 return MapSecurityError(status);
1051 }
1052
1053 // The received ciphertext was decrypted in place in recv_buffer_. Remember
1054 // the location and length of the decrypted plaintext and any unused
1055 // ciphertext.
1056 decrypted_ptr_ = NULL;
1057 bytes_decrypted_ = 0;
1058 received_ptr_ = NULL;
974 bytes_received_ = 0; 1059 bytes_received_ = 0;
975 return OK; 1060 for (int i = 1; i < 4; i++) {
976 } 1061 if (!decrypted_ptr_ && buffers[i].BufferType == SECBUFFER_DATA) {
1062 decrypted_ptr_ = static_cast<char*>(buffers[i].pvBuffer);
1063 bytes_decrypted_ = buffers[i].cbBuffer;
1064 }
1065 if (!received_ptr_ && buffers[i].BufferType == SECBUFFER_EXTRA) {
1066 received_ptr_ = static_cast<char*>(buffers[i].pvBuffer);
1067 bytes_received_ = buffers[i].cbBuffer;
1068 }
1069 }
977 1070
978 if (status != SEC_E_OK && status != SEC_I_RENEGOTIATE) { 1071 DCHECK(len == 0);
979 DCHECK(status != SEC_E_MESSAGE_ALTERED); 1072 if (bytes_decrypted_ != 0) {
980 return MapSecurityError(status); 1073 len = std::min(user_read_buf_len_, bytes_decrypted_);
981 } 1074 memcpy(user_read_buf_->data(), decrypted_ptr_, len);
1075 decrypted_ptr_ += len;
1076 bytes_decrypted_ -= len;
1077 }
1078 if (bytes_decrypted_ == 0) {
1079 decrypted_ptr_ = NULL;
1080 if (bytes_received_ != 0) {
1081 memmove(recv_buffer_.get(), received_ptr_, bytes_received_);
1082 received_ptr_ = recv_buffer_.get();
1083 }
1084 }
982 1085
983 // The received ciphertext was decrypted in place in recv_buffer_. Remember 1086 if (status == SEC_I_RENEGOTIATE) {
984 // the location and length of the decrypted plaintext and any unused 1087 if (bytes_received_ != 0) {
985 // ciphertext. 1088 // The server requested renegotiation, but there are some data yet to
986 decrypted_ptr_ = NULL; 1089 // be decrypted. The Platform SDK WebClient.c sample doesn't handle
987 bytes_decrypted_ = 0; 1090 // this, so we don't know how to handle this. Assume this cannot
988 received_ptr_ = NULL; 1091 // happen.
989 bytes_received_ = 0; 1092 LOG(ERROR) << "DecryptMessage returned SEC_I_RENEGOTIATE with a buffer "
990 for (int i = 1; i < 4; i++) { 1093 << "of type SECBUFFER_EXTRA.";
991 if (!decrypted_ptr_ && buffers[i].BufferType == SECBUFFER_DATA) { 1094 return ERR_SSL_RENEGOTIATION_REQUESTED;
992 decrypted_ptr_ = static_cast<char*>(buffers[i].pvBuffer); 1095 }
993 bytes_decrypted_ = buffers[i].cbBuffer; 1096 if (len != 0) {
1097 // The server requested renegotiation, but there are some decrypted
1098 // data. We can't start renegotiation until we have returned all
1099 // decrypted data to the caller.
1100 //
1101 // This hasn't happened during testing. Assume this cannot happen even
1102 // though we know how to handle this.
1103 LOG(ERROR) << "DecryptMessage returned SEC_I_RENEGOTIATE with a buffer "
1104 << "of type SECBUFFER_DATA.";
1105 return ERR_SSL_RENEGOTIATION_REQUESTED;
1106 }
1107 // Jump to the handshake sequence. Will come back when the rehandshake is
1108 // done.
1109 renegotiating_ = true;
1110 ignore_ok_result_ = true; // OK doesn't mean EOF.
1111 // If renegotiation handshake occurred, we need to go back into the
1112 // handshake state machine.
1113 next_state_ = STATE_HANDSHAKE_READ_COMPLETE;
1114 return DoLoop(OK);
994 } 1115 }
995 if (!received_ptr_ && buffers[i].BufferType == SECBUFFER_EXTRA) {
996 received_ptr_ = static_cast<char*>(buffers[i].pvBuffer);
997 bytes_received_ = buffers[i].cbBuffer;
998 }
999 }
1000 1116
1001 int len = 0; 1117 // We've already copied data into the user buffer, so quit now.
1002 if (bytes_decrypted_ != 0) { 1118 // TODO(mbelshe): We really should keep decoding as long as we can. This
1003 len = std::min(user_buf_len_, bytes_decrypted_); 1119 // break out is causing us to return pretty small chunks of data up to the
1004 memcpy(user_buf_->data(), decrypted_ptr_, len); 1120 // application, even though more is already buffered and ready to be
1005 decrypted_ptr_ += len; 1121 // decoded.
1006 bytes_decrypted_ -= len; 1122 if (len)
1007 } 1123 break;
1008 if (bytes_decrypted_ == 0) {
1009 decrypted_ptr_ = NULL;
1010 if (bytes_received_ != 0) {
1011 memmove(recv_buffer_.get(), received_ptr_, bytes_received_);
1012 received_ptr_ = recv_buffer_.get();
1013 }
1014 }
1015
1016 if (status == SEC_I_RENEGOTIATE) {
1017 if (bytes_received_ != 0) {
1018 // The server requested renegotiation, but there are some data yet to
1019 // be decrypted. The Platform SDK WebClient.c sample doesn't handle
1020 // this, so we don't know how to handle this. Assume this cannot
1021 // happen.
1022 LOG(ERROR) << "DecryptMessage returned SEC_I_RENEGOTIATE with a buffer "
1023 << "of type SECBUFFER_EXTRA.";
1024 return ERR_SSL_RENEGOTIATION_REQUESTED;
1025 }
1026 if (len != 0) {
1027 // The server requested renegotiation, but there are some decrypted
1028 // data. We can't start renegotiation until we have returned all
1029 // decrypted data to the caller.
1030 //
1031 // This hasn't happened during testing. Assume this cannot happen even
1032 // though we know how to handle this.
1033 LOG(ERROR) << "DecryptMessage returned SEC_I_RENEGOTIATE with a buffer "
1034 << "of type SECBUFFER_DATA.";
1035 return ERR_SSL_RENEGOTIATION_REQUESTED;
1036 }
1037 // Jump to the handshake sequence. Will come back when the rehandshake is
1038 // done.
1039 renegotiating_ = true;
1040 next_state_ = STATE_HANDSHAKE_READ_COMPLETE;
1041 ignore_ok_result_ = true; // OK doesn't mean EOF.
1042 return len;
1043 } 1124 }
1044 1125
1045 // If we decrypted 0 bytes, don't report 0 bytes read, which would be 1126 // If we decrypted 0 bytes, don't report 0 bytes read, which would be
1046 // mistaken for EOF. Continue decrypting or read more. 1127 // mistaken for EOF. Continue decrypting or read more.
1047 if (len == 0) 1128 if (len == 0)
1048 SetNextStateForRead(); 1129 return DoPayloadRead();
1049 return len; 1130 return len;
1050 } 1131 }
1051 1132
1052 int SSLClientSocketWin::DoPayloadEncrypt() { 1133 int SSLClientSocketWin::DoPayloadEncrypt() {
1053 DCHECK(user_buf_); 1134 DCHECK(completed_handshake());
1054 DCHECK(user_buf_len_ > 0); 1135 DCHECK(user_write_buf_);
1136 DCHECK(user_write_buf_len_ > 0);
1055 1137
1056 ULONG message_len = std::min( 1138 ULONG message_len = std::min(
1057 stream_sizes_.cbMaximumMessage, static_cast<ULONG>(user_buf_len_)); 1139 stream_sizes_.cbMaximumMessage, static_cast<ULONG>(user_write_buf_len_));
1058 ULONG alloc_len = 1140 ULONG alloc_len =
1059 message_len + stream_sizes_.cbHeader + stream_sizes_.cbTrailer; 1141 message_len + stream_sizes_.cbHeader + stream_sizes_.cbTrailer;
1060 user_buf_len_ = message_len; 1142 user_write_buf_len_ = message_len;
1061 1143
1062 payload_send_buffer_.reset(new char[alloc_len]); 1144 payload_send_buffer_.reset(new char[alloc_len]);
1063 memcpy(&payload_send_buffer_[stream_sizes_.cbHeader], 1145 memcpy(&payload_send_buffer_[stream_sizes_.cbHeader],
1064 user_buf_->data(), message_len); 1146 user_write_buf_->data(), message_len);
1065 1147
1066 SecBuffer buffers[4]; 1148 SecBuffer buffers[4];
1067 buffers[0].pvBuffer = payload_send_buffer_.get(); 1149 buffers[0].pvBuffer = payload_send_buffer_.get();
1068 buffers[0].cbBuffer = stream_sizes_.cbHeader; 1150 buffers[0].cbBuffer = stream_sizes_.cbHeader;
1069 buffers[0].BufferType = SECBUFFER_STREAM_HEADER; 1151 buffers[0].BufferType = SECBUFFER_STREAM_HEADER;
1070 1152
1071 buffers[1].pvBuffer = &payload_send_buffer_[stream_sizes_.cbHeader]; 1153 buffers[1].pvBuffer = &payload_send_buffer_[stream_sizes_.cbHeader];
1072 buffers[1].cbBuffer = message_len; 1154 buffers[1].cbBuffer = message_len;
1073 buffers[1].BufferType = SECBUFFER_DATA; 1155 buffers[1].BufferType = SECBUFFER_DATA;
1074 1156
(...skipping 11 matching lines...) Expand all
1086 1168
1087 SECURITY_STATUS status = EncryptMessage(&ctxt_, 0, &buffer_desc, 0); 1169 SECURITY_STATUS status = EncryptMessage(&ctxt_, 0, &buffer_desc, 0);
1088 1170
1089 if (FAILED(status)) 1171 if (FAILED(status))
1090 return MapSecurityError(status); 1172 return MapSecurityError(status);
1091 1173
1092 payload_send_buffer_len_ = buffers[0].cbBuffer + 1174 payload_send_buffer_len_ = buffers[0].cbBuffer +
1093 buffers[1].cbBuffer + 1175 buffers[1].cbBuffer +
1094 buffers[2].cbBuffer; 1176 buffers[2].cbBuffer;
1095 DCHECK(bytes_sent_ == 0); 1177 DCHECK(bytes_sent_ == 0);
1096
1097 next_state_ = STATE_PAYLOAD_WRITE;
1098 return OK; 1178 return OK;
1099 } 1179 }
1100 1180
1101 int SSLClientSocketWin::DoPayloadWrite() { 1181 int SSLClientSocketWin::DoPayloadWrite() {
1102 next_state_ = STATE_PAYLOAD_WRITE_COMPLETE; 1182 DCHECK(completed_handshake());
1103 1183
1104 // We should have something to send. 1184 // We should have something to send.
1105 DCHECK(payload_send_buffer_.get()); 1185 DCHECK(payload_send_buffer_.get());
1106 DCHECK(payload_send_buffer_len_ > 0); 1186 DCHECK(payload_send_buffer_len_ > 0);
1107 DCHECK(!transport_buf_); 1187 DCHECK(!transport_write_buf_);
1108 1188
1109 const char* buf = payload_send_buffer_.get() + bytes_sent_; 1189 const char* buf = payload_send_buffer_.get() + bytes_sent_;
1110 int buf_len = payload_send_buffer_len_ - bytes_sent_; 1190 int buf_len = payload_send_buffer_len_ - bytes_sent_;
1111 transport_buf_ = new IOBuffer(buf_len); 1191 transport_write_buf_ = new IOBuffer(buf_len);
1112 memcpy(transport_buf_->data(), buf, buf_len); 1192 memcpy(transport_write_buf_->data(), buf, buf_len);
1113 1193
1114 return transport_->Write(transport_buf_, buf_len, &io_callback_); 1194 int rv = transport_->Write(transport_write_buf_, buf_len, &write_callback_);
1195 if (rv != ERR_IO_PENDING)
1196 rv = DoPayloadWriteComplete(rv);
1197 return rv;
1115 } 1198 }
1116 1199
1117 int SSLClientSocketWin::DoPayloadWriteComplete(int result) { 1200 int SSLClientSocketWin::DoPayloadWriteComplete(int result) {
1118 DCHECK(transport_buf_); 1201 DCHECK(transport_write_buf_);
1119 transport_buf_ = NULL; 1202 transport_write_buf_ = NULL;
1120 if (result < 0) 1203 if (result < 0)
1121 return result; 1204 return result;
1122 1205
1123 DCHECK(result != 0); 1206 DCHECK(result != 0);
1124 1207
1125 bytes_sent_ += result; 1208 bytes_sent_ += result;
1126 DCHECK(bytes_sent_ <= payload_send_buffer_len_); 1209 DCHECK(bytes_sent_ <= payload_send_buffer_len_);
1127 1210
1128 if (bytes_sent_ >= payload_send_buffer_len_) { 1211 if (bytes_sent_ >= payload_send_buffer_len_) {
1129 bool overflow = (bytes_sent_ > payload_send_buffer_len_); 1212 bool overflow = (bytes_sent_ > payload_send_buffer_len_);
1130 payload_send_buffer_.reset(); 1213 payload_send_buffer_.reset();
1131 payload_send_buffer_len_ = 0; 1214 payload_send_buffer_len_ = 0;
1132 bytes_sent_ = 0; 1215 bytes_sent_ = 0;
1133 if (overflow) // Bug! 1216 if (overflow) // Bug!
1134 return ERR_UNEXPECTED; 1217 return ERR_UNEXPECTED;
1135 // Done 1218 // Done
1136 return user_buf_len_; 1219 return user_write_buf_len_;
1137 } 1220 }
1138 1221
1139 // Send the remaining bytes. 1222 // Send the remaining bytes.
1140 next_state_ = STATE_PAYLOAD_WRITE; 1223 return DoPayloadWrite();
1141 return OK; 1224 }
1225
1226 int SSLClientSocketWin::DoCompletedRenegotiation(int result) {
1227 // The user had a read in progress, which was usurped by the renegotiation.
1228 // Restart the read sequence.
1229 next_state_ = STATE_COMPLETED_HANDSHAKE;
1230 DCHECK(result == OK);
1231 return DoPayloadRead();
1142 } 1232 }
1143 1233
1144 int SSLClientSocketWin::DidCompleteHandshake() { 1234 int SSLClientSocketWin::DidCompleteHandshake() {
1145 SECURITY_STATUS status = QueryContextAttributes( 1235 SECURITY_STATUS status = QueryContextAttributes(
1146 &ctxt_, SECPKG_ATTR_STREAM_SIZES, &stream_sizes_); 1236 &ctxt_, SECPKG_ATTR_STREAM_SIZES, &stream_sizes_);
1147 if (status != SEC_E_OK) { 1237 if (status != SEC_E_OK) {
1148 DLOG(ERROR) << "QueryContextAttributes (stream sizes) failed: " << status; 1238 DLOG(ERROR) << "QueryContextAttributes (stream sizes) failed: " << status;
1149 return MapSecurityError(status); 1239 return MapSecurityError(status);
1150 } 1240 }
1151 DCHECK(!server_cert_ || renegotiating_); 1241 DCHECK(!server_cert_ || renegotiating_);
1152 PCCERT_CONTEXT server_cert_handle = NULL; 1242 PCCERT_CONTEXT server_cert_handle = NULL;
1153 status = QueryContextAttributes( 1243 status = QueryContextAttributes(
1154 &ctxt_, SECPKG_ATTR_REMOTE_CERT_CONTEXT, &server_cert_handle); 1244 &ctxt_, SECPKG_ATTR_REMOTE_CERT_CONTEXT, &server_cert_handle);
1155 if (status != SEC_E_OK) { 1245 if (status != SEC_E_OK) {
1156 DLOG(ERROR) << "QueryContextAttributes (remote cert) failed: " << status; 1246 DLOG(ERROR) << "QueryContextAttributes (remote cert) failed: " << status;
1157 return MapSecurityError(status); 1247 return MapSecurityError(status);
1158 } 1248 }
1159 if (renegotiating_ && 1249 if (renegotiating_ &&
1160 SameCert(server_cert_->os_cert_handle(), server_cert_handle)) { 1250 SameCert(server_cert_->os_cert_handle(), server_cert_handle)) {
1161 // We already verified the server certificate. Either it is good or the 1251 // We already verified the server certificate. Either it is good or the
1162 // user has accepted the certificate error. 1252 // user has accepted the certificate error.
1163 CertFreeCertificateContext(server_cert_handle); 1253 CertFreeCertificateContext(server_cert_handle);
1164 DidCompleteRenegotiation(OK); 1254 DidCompleteRenegotiation();
1165 } else { 1255 } else {
1166 server_cert_ = X509Certificate::CreateFromHandle( 1256 server_cert_ = X509Certificate::CreateFromHandle(
1167 server_cert_handle, X509Certificate::SOURCE_FROM_NETWORK); 1257 server_cert_handle, X509Certificate::SOURCE_FROM_NETWORK);
1168 1258
1169 next_state_ = STATE_VERIFY_CERT; 1259 next_state_ = STATE_VERIFY_CERT;
1170 } 1260 }
1171 return OK; 1261 return OK;
1172 } 1262 }
1173 1263
1174 // Called when a renegotiation is completed. |result| is the verification 1264 // Called when a renegotiation is completed. |result| is the verification
1175 // result of the server certificate received during renegotiation. 1265 // result of the server certificate received during renegotiation.
1176 void SSLClientSocketWin::DidCompleteRenegotiation(int result) { 1266 void SSLClientSocketWin::DidCompleteRenegotiation() {
1177 // A rehandshake, started in the middle of a Read, has completed.
1178 renegotiating_ = false; 1267 renegotiating_ = false;
1179 // Pick up where we left off. Go back to reading data. 1268 next_state_ = STATE_COMPLETED_RENEGOTIATION;
1180 if (result == OK)
1181 SetNextStateForRead();
1182 } 1269 }
1183 1270
1184 void SSLClientSocketWin::LogConnectionTypeMetrics() const { 1271 void SSLClientSocketWin::LogConnectionTypeMetrics() const {
1185 UpdateConnectionTypeHistograms(CONNECTION_SSL); 1272 UpdateConnectionTypeHistograms(CONNECTION_SSL);
1186 if (server_cert_verify_result_.has_md5) 1273 if (server_cert_verify_result_.has_md5)
1187 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5); 1274 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5);
1188 if (server_cert_verify_result_.has_md2) 1275 if (server_cert_verify_result_.has_md2)
1189 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2); 1276 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2);
1190 if (server_cert_verify_result_.has_md4) 1277 if (server_cert_verify_result_.has_md4)
1191 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD4); 1278 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD4);
1192 if (server_cert_verify_result_.has_md5_ca) 1279 if (server_cert_verify_result_.has_md5_ca)
1193 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5_CA); 1280 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5_CA);
1194 if (server_cert_verify_result_.has_md2_ca) 1281 if (server_cert_verify_result_.has_md2_ca)
1195 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2_CA); 1282 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2_CA);
1196 } 1283 }
1197 1284
1198 void SSLClientSocketWin::SetNextStateForRead() {
1199 if (bytes_received_ == 0) {
1200 next_state_ = STATE_PAYLOAD_READ;
1201 } else {
1202 next_state_ = STATE_PAYLOAD_READ_COMPLETE;
1203 ignore_ok_result_ = true; // OK doesn't mean EOF.
1204 }
1205 }
1206
1207 void SSLClientSocketWin::FreeSendBuffer() { 1285 void SSLClientSocketWin::FreeSendBuffer() {
1208 SECURITY_STATUS status = FreeContextBuffer(send_buffer_.pvBuffer); 1286 SECURITY_STATUS status = FreeContextBuffer(send_buffer_.pvBuffer);
1209 DCHECK(status == SEC_E_OK); 1287 DCHECK(status == SEC_E_OK);
1210 memset(&send_buffer_, 0, sizeof(send_buffer_)); 1288 memset(&send_buffer_, 0, sizeof(send_buffer_));
1211 } 1289 }
1212 1290
1213 } // namespace net 1291 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698