diff options
Diffstat (limited to 'net/base/ssl_client_socket_mac.cc')
-rw-r--r-- | net/base/ssl_client_socket_mac.cc | 122 |
1 files changed, 61 insertions, 61 deletions
diff --git a/net/base/ssl_client_socket_mac.cc b/net/base/ssl_client_socket_mac.cc index d351db5..0d10030 100644 --- a/net/base/ssl_client_socket_mac.cc +++ b/net/base/ssl_client_socket_mac.cc @@ -119,11 +119,11 @@ int NetErrorFromOSStatus(OSStatus status) { return ERR_CERT_INVALID; case errSSLPeerCertRevoked: return ERR_CERT_REVOKED; - + case errSSLClosedGraceful: case noErr: return OK; - + case errSSLBadRecordMac: case errSSLBufferOverflow: case errSSLDecryptionFail: @@ -168,7 +168,7 @@ OSStatus OSStatusFromNetError(int net_error) { int KeySizeOfCipherSuite(SSLCipherSuite suite) { switch (suite) { // SSL 2 only - + case SSL_RSA_WITH_DES_CBC_MD5: return 56; case SSL_RSA_WITH_3DES_EDE_CBC_MD5: @@ -178,9 +178,9 @@ int KeySizeOfCipherSuite(SSLCipherSuite suite) { return 128; case SSL_NO_SUCH_CIPHERSUITE: // ** return 0; - + // SSL 2, 3, TLS - + case SSL_NULL_WITH_NULL_NULL: case SSL_RSA_WITH_NULL_MD5: case SSL_RSA_WITH_NULL_SHA: // ** @@ -217,9 +217,9 @@ int KeySizeOfCipherSuite(SSLCipherSuite suite) { case SSL_RSA_WITH_IDEA_CBC_SHA: // ** case SSL_DH_anon_WITH_RC4_128_MD5: return 128; - + // TLS AES options (see RFC 3268) - + case TLS_RSA_WITH_AES_128_CBC_SHA: case TLS_DH_DSS_WITH_AES_128_CBC_SHA: // ** case TLS_DH_RSA_WITH_AES_128_CBC_SHA: // ** @@ -234,7 +234,7 @@ int KeySizeOfCipherSuite(SSLCipherSuite suite) { case TLS_DHE_RSA_WITH_AES_256_CBC_SHA: case TLS_DH_anon_WITH_AES_256_CBC_SHA: return 256; - + default: return -1; } @@ -287,13 +287,13 @@ int SSLClientSocketMac::ReconnectIgnoringLastError( void SSLClientSocketMac::Disconnect() { completed_handshake_ = false; - + if (ssl_context_) { SSLClose(ssl_context_); SSLDisposeContext(ssl_context_); ssl_context_ = NULL; } - + transport_->Disconnect(); } @@ -342,7 +342,7 @@ int SSLClientSocketMac::Write(const char* buf, int buf_len, user_buf_ = const_cast<char*>(buf); user_buf_len_ = buf_len; - + next_state_ = STATE_PAYLOAD_WRITE; int rv = DoLoop(OK); if (rv == ERR_IO_PENDING) @@ -353,15 +353,15 @@ int SSLClientSocketMac::Write(const char* buf, int buf_len, void SSLClientSocketMac::GetSSLInfo(SSLInfo* ssl_info) { DCHECK(completed_handshake_); OSStatus status; - + ssl_info->Reset(); - + // set cert CFArrayRef certs; status = SSLCopyPeerCertificates(ssl_context_, &certs); if (!status) { DCHECK(CFArrayGetCount(certs) > 0); - + SecCertificateRef client_cert = static_cast<SecCertificateRef>( const_cast<void*>(CFArrayGetValueAtIndex(certs, 0))); @@ -370,17 +370,17 @@ void SSLClientSocketMac::GetSSLInfo(SSLInfo* ssl_info) { client_cert, X509Certificate::SOURCE_FROM_NETWORK); CFRelease(certs); } - + // update status ssl_info->cert_status = server_cert_status_; - + // security info SSLCipherSuite suite; status = SSLGetNegotiatedCipher(ssl_context_, &suite); if (!status) ssl_info->security_bits = KeySizeOfCipherSuite(suite); } - + void SSLClientSocketMac::DoCallback(int rv) { DCHECK(rv != ERR_IO_PENDING); DCHECK(user_callback_); @@ -459,78 +459,78 @@ int SSLClientSocketMac::DoConnectComplete(int result) { return result; OSStatus status = noErr; - + status = SSLNewContext(false, &ssl_context_); if (status) return NetErrorFromOSStatus(status); - + status = SSLSetProtocolVersionEnabled(ssl_context_, kSSLProtocol2, ssl_config_.ssl2_enabled); if (status) return NetErrorFromOSStatus(status); - + status = SSLSetProtocolVersionEnabled(ssl_context_, kSSLProtocol3, ssl_config_.ssl3_enabled); if (status) return NetErrorFromOSStatus(status); - + status = SSLSetProtocolVersionEnabled(ssl_context_, kTLSProtocol1, ssl_config_.tls1_enabled); if (status) return NetErrorFromOSStatus(status); - + status = SSLSetIOFuncs(ssl_context_, SSLReadCallback, SSLWriteCallback); if (status) return NetErrorFromOSStatus(status); - + status = SSLSetConnection(ssl_context_, this); if (status) return NetErrorFromOSStatus(status); - + status = SSLSetPeerDomainName(ssl_context_, hostname_.c_str(), hostname_.length()); if (status) return NetErrorFromOSStatus(status); - + next_state_ = STATE_HANDSHAKE; return OK; } int SSLClientSocketMac::DoHandshake() { OSStatus status = SSLHandshake(ssl_context_); - + if (status == errSSLWouldBlock) next_state_ = STATE_HANDSHAKE; - + if (status == noErr) completed_handshake_ = true; - + int net_error = NetErrorFromOSStatus(status); - + // At this point we have a connection. For now, we're going to use the default // certificate verification that the system does, and accept its answer for // the cert status. In the future, we'll need to call SSLSetEnableCertVerify // to disable cert verification and do the verification ourselves. This allows // very fine-grained control over what we'll accept for certification. // TODO(avi): ditto - + // TODO(wtc): for now, always check revocation. server_cert_status_ = CERT_STATUS_REV_CHECKING_ENABLED; if (net_error) server_cert_status_ |= MapNetErrorToCertStatus(net_error); - + return net_error; } int SSLClientSocketMac::DoReadComplete(int result) { if (result < 0) return result; - + recv_buffer_tail_slop_ -= result; - + return result; } @@ -539,10 +539,10 @@ void SSLClientSocketMac::OnWriteComplete(int result) { pending_send_error_ = result; return; } - + send_buffer_.erase(send_buffer_.begin(), send_buffer_.begin() + result); - + if (!send_buffer_.empty()) SSLWriteCallback(this, NULL, NULL); } @@ -553,22 +553,22 @@ int SSLClientSocketMac::DoPayloadRead() { user_buf_, user_buf_len_, &processed); - + // There's a subtle difference here in semantics of the "would block" errors. // In our code, ERR_IO_PENDING means the whole operation is async, while // errSSLWouldBlock means that the stream isn't ending (and is often returned // along with partial data). So even though "would block" is returned, if we // have data, let's just return it. - + if (processed > 0) { next_state_ = STATE_NONE; return processed; } - + if (status == errSSLWouldBlock) { next_state_ = STATE_PAYLOAD_READ; } - + return NetErrorFromOSStatus(status); } @@ -578,10 +578,10 @@ int SSLClientSocketMac::DoPayloadWrite() { user_buf_, user_buf_len_, &processed); - + if (processed > 0) return processed; - + return NetErrorFromOSStatus(status); } @@ -665,40 +665,40 @@ OSStatus SSLClientSocketMac::SSLReadCallback(SSLConnectionRef connection, SSLClientSocketMac* us = const_cast<SSLClientSocketMac*>( static_cast<const SSLClientSocketMac*>(connection)); - + // If we have I/O in flight, promise we'll get back to them and use the // existing callback to do so - + if (us->next_io_state_ == STATE_READ_COMPLETE) { *data_length = 0; return errSSLWouldBlock; } - + // Start with what's in the buffer - + size_t total_read = us->recv_buffer_.size() - us->recv_buffer_head_slop_ - us->recv_buffer_tail_slop_; - + // Resize the buffer if needed - + if (us->recv_buffer_.size() - us->recv_buffer_head_slop_ < *data_length) { us->recv_buffer_.resize(us->recv_buffer_head_slop_ + *data_length); us->recv_buffer_tail_slop_ = *data_length - total_read; } - + int rv = 1; // any old value to spin the loop below while (rv > 0 && total_read < *data_length) { rv = us->transport_->Read(&us->recv_buffer_[us->recv_buffer_head_slop_ + total_read], us->recv_buffer_tail_slop_, &us->io_callback_); - + if (rv > 0) { total_read += rv; us->recv_buffer_tail_slop_ -= rv; } - } - + } + *data_length = total_read; if (total_read) { memcpy(data, &us->recv_buffer_[us->recv_buffer_head_slop_], total_read); @@ -714,31 +714,31 @@ OSStatus SSLClientSocketMac::SSLReadCallback(SSLConnectionRef connection, us->recv_buffer_head_slop_ = 0; } } - + if (rv == ERR_IO_PENDING) { us->next_io_state_ = STATE_READ_COMPLETE; } - + if (rv < 0) return OSStatusFromNetError(rv); - + return noErr; } // static -OSStatus SSLClientSocketMac::SSLWriteCallback(SSLConnectionRef connection, - const void* data, +OSStatus SSLClientSocketMac::SSLWriteCallback(SSLConnectionRef connection, + const void* data, size_t* data_length) { SSLClientSocketMac* us = const_cast<SSLClientSocketMac*>( static_cast<const SSLClientSocketMac*>(connection)); - + if (us->pending_send_error_ != OK) { OSStatus status = OSStatusFromNetError(us->pending_send_error_); us->pending_send_error_ = OK; return status; } - + if (data) us->send_buffer_.insert(us->send_buffer_.end(), static_cast<const char*>(data), @@ -751,14 +751,14 @@ OSStatus SSLClientSocketMac::SSLWriteCallback(SSLConnectionRef connection, if (rv > 0) { us->send_buffer_.erase(us->send_buffer_.begin(), us->send_buffer_.begin() + rv); - + } } while (rv > 0 && !us->send_buffer_.empty()); - + if (rv < 0 && rv != ERR_IO_PENDING) { return OSStatusFromNetError(rv); } - + // always lie to our caller return noErr; } |