Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "bin/secure_socket.h" | 5 #include "bin/secure_socket.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <sys/stat.h> | 9 #include <sys/stat.h> |
| 10 #include <stdio.h> | 10 #include <stdio.h> |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 265 start_validity_date, | 265 start_validity_date, |
| 266 end_validity_date }; | 266 end_validity_date }; |
| 267 return Dart_New(x509_class, Dart_Null(), 4, arguments); | 267 return Dart_New(x509_class, Dart_Null(), 4, arguments); |
| 268 } | 268 } |
| 269 | 269 |
| 270 | 270 |
| 271 void SSLFilter::Init(Dart_Handle dart_this) { | 271 void SSLFilter::Init(Dart_Handle dart_this) { |
| 272 if (!library_initialized_) { | 272 if (!library_initialized_) { |
| 273 InitializeLibrary(NULL, "", true, false); | 273 InitializeLibrary(NULL, "", true, false); |
| 274 } | 274 } |
| 275 string_start_ = ThrowIfError( | 275 ASSERT(string_start_ == NULL); |
| 276 Dart_NewPersistentHandle(DartUtils::NewString("start"))); | 276 string_start_ = Dart_NewPersistentHandle(DartUtils::NewString("start")); |
| 277 string_length_ = ThrowIfError( | 277 ASSERT(string_start_ != NULL); |
| 278 Dart_NewPersistentHandle(DartUtils::NewString("length"))); | 278 ASSERT(string_length_ == NULL); |
| 279 string_length_ = Dart_NewPersistentHandle(DartUtils::NewString("length")); | |
| 280 ASSERT(string_length_ != NULL); | |
| 281 ASSERT(bad_certificate_callback_ == NULL); | |
| 282 bad_certificate_callback_ = Dart_NewPersistentHandle(Dart_Null()); | |
| 283 ASSERT(bad_certificate_callback_ != NULL); | |
| 279 | 284 |
| 280 InitializeBuffers(dart_this); | 285 InitializeBuffers(dart_this); |
| 281 filter_ = memio_CreateIOLayer(kMemioBufferSize); | 286 filter_ = memio_CreateIOLayer(kMemioBufferSize); |
| 282 } | 287 } |
| 283 | 288 |
| 284 | 289 |
| 285 void SSLFilter::InitializeBuffers(Dart_Handle dart_this) { | 290 void SSLFilter::InitializeBuffers(Dart_Handle dart_this) { |
| 286 // Create SSLFilter buffers as ExternalUint8Array objects. | 291 // Create SSLFilter buffers as ExternalUint8Array objects. |
| 287 Dart_Handle dart_buffers_object = ThrowIfError( | 292 Dart_Handle dart_buffers_object = ThrowIfError( |
| 288 Dart_GetField(dart_this, DartUtils::NewString("buffers"))); | 293 Dart_GetField(dart_this, DartUtils::NewString("buffers"))); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 306 Dart_ThrowException(DartUtils::NewString( | 311 Dart_ThrowException(DartUtils::NewString( |
| 307 "Invalid encrypted buffer size in _ExternalBuffer")); | 312 "Invalid encrypted buffer size in _ExternalBuffer")); |
| 308 } | 313 } |
| 309 buffer_size_ = static_cast<int>(buffer_size); | 314 buffer_size_ = static_cast<int>(buffer_size); |
| 310 encrypted_buffer_size_ = static_cast<int>(encrypted_buffer_size); | 315 encrypted_buffer_size_ = static_cast<int>(encrypted_buffer_size); |
| 311 | 316 |
| 312 | 317 |
| 313 Dart_Handle data_identifier = DartUtils::NewString("data"); | 318 Dart_Handle data_identifier = DartUtils::NewString("data"); |
| 314 for (int i = 0; i < kNumBuffers; ++i) { | 319 for (int i = 0; i < kNumBuffers; ++i) { |
| 315 int size = isEncrypted(i) ? encrypted_buffer_size_ : buffer_size_; | 320 int size = isEncrypted(i) ? encrypted_buffer_size_ : buffer_size_; |
| 316 dart_buffer_objects_[i] = ThrowIfError( | 321 dart_buffer_objects_[i] = |
| 317 Dart_NewPersistentHandle(Dart_ListGetAt(dart_buffers_object, i))); | 322 Dart_NewPersistentHandle(Dart_ListGetAt(dart_buffers_object, i)); |
| 323 ASSERT(dart_buffer_objects_[i] != NULL); | |
| 318 buffers_[i] = new uint8_t[size]; | 324 buffers_[i] = new uint8_t[size]; |
| 319 Dart_Handle data = ThrowIfError( | 325 Dart_Handle data = ThrowIfError( |
| 320 Dart_NewExternalTypedData(kUint8, buffers_[i], size, NULL, NULL)); | 326 Dart_NewExternalTypedData(kUint8, buffers_[i], size)); |
| 321 ThrowIfError(Dart_SetField(dart_buffer_objects_[i], | 327 ThrowIfError(Dart_SetField(Dart_HandleFromPersistent(dart_buffer_objects_[i] ), |
| 322 data_identifier, | 328 data_identifier, |
| 323 data)); | 329 data)); |
| 324 } | 330 } |
| 325 } | 331 } |
| 326 | 332 |
| 327 | 333 |
| 328 void SSLFilter::RegisterHandshakeCompleteCallback(Dart_Handle complete) { | 334 void SSLFilter::RegisterHandshakeCompleteCallback(Dart_Handle complete) { |
| 329 ASSERT(NULL == handshake_complete_); | 335 ASSERT(NULL == handshake_complete_); |
| 330 handshake_complete_ = ThrowIfError(Dart_NewPersistentHandle(complete)); | 336 handshake_complete_ = Dart_NewPersistentHandle(complete); |
| 337 ASSERT(handshake_complete_ != NULL); | |
| 331 } | 338 } |
| 332 | 339 |
| 333 | 340 |
| 334 void SSLFilter::RegisterBadCertificateCallback(Dart_Handle callback) { | 341 void SSLFilter::RegisterBadCertificateCallback(Dart_Handle callback) { |
| 335 if (NULL != bad_certificate_callback_) { | 342 ASSERT(bad_certificate_callback_ != NULL); |
|
siva
2013/05/28 17:37:18
Why has this been changed to eagerly create bad_ce
Ivan Posva
2013/05/28 21:12:20
It was more regular this way by avoiding extra (ba
| |
| 336 Dart_DeletePersistentHandle(bad_certificate_callback_); | 343 Dart_DeletePersistentHandle(bad_certificate_callback_); |
| 337 } | 344 bad_certificate_callback_ = Dart_NewPersistentHandle(callback); |
| 338 bad_certificate_callback_ = ThrowIfError(Dart_NewPersistentHandle(callback)); | 345 ASSERT(bad_certificate_callback_ != NULL); |
| 339 } | 346 } |
| 340 | 347 |
| 341 static const char* builtin_roots_module = | 348 static const char* builtin_roots_module = |
| 342 #if defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID) | 349 #if defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID) |
| 343 "name=\"Root Certs\" library=\"libnssckbi.so\""; | 350 "name=\"Root Certs\" library=\"libnssckbi.so\""; |
| 344 #elif defined(TARGET_OS_MACOS) | 351 #elif defined(TARGET_OS_MACOS) |
| 345 "name=\"Root Certs\" library=\"libnssckbi.dylib\""; | 352 "name=\"Root Certs\" library=\"libnssckbi.dylib\""; |
| 346 #elif defined(TARGET_OS_WINDOWS) | 353 #elif defined(TARGET_OS_WINDOWS) |
| 347 "name=\"Root Certs\" library=\"nssckbi.dll\""; | 354 "name=\"Root Certs\" library=\"nssckbi.dll\""; |
| 348 #else | 355 #else |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 420 if (!retry) { | 427 if (!retry) { |
| 421 return PL_strdup(static_cast<char*>(arg)); // Freed by NSS internals. | 428 return PL_strdup(static_cast<char*>(arg)); // Freed by NSS internals. |
| 422 } | 429 } |
| 423 return NULL; | 430 return NULL; |
| 424 } | 431 } |
| 425 | 432 |
| 426 | 433 |
| 427 SECStatus BadCertificateCallback(void* filter, PRFileDesc* fd) { | 434 SECStatus BadCertificateCallback(void* filter, PRFileDesc* fd) { |
| 428 SSLFilter* ssl_filter = static_cast<SSLFilter*>(filter); | 435 SSLFilter* ssl_filter = static_cast<SSLFilter*>(filter); |
| 429 Dart_Handle callback = ssl_filter->bad_certificate_callback(); | 436 Dart_Handle callback = ssl_filter->bad_certificate_callback(); |
| 430 if (callback == NULL || Dart_IsNull(callback)) return SECFailure; | 437 if (Dart_IsNull(callback)) return SECFailure; |
| 431 | 438 |
| 432 Dart_EnterScope(); | 439 Dart_EnterScope(); |
| 433 Dart_Handle x509_object = ssl_filter->PeerCertificate(); | 440 Dart_Handle x509_object = ssl_filter->PeerCertificate(); |
| 434 Dart_Handle result = | 441 Dart_Handle result = |
| 435 ThrowIfError(Dart_InvokeClosure(callback, 1, &x509_object)); | 442 ThrowIfError(Dart_InvokeClosure(callback, 1, &x509_object)); |
| 436 bool c_result = Dart_IsBoolean(result) && DartUtils::GetBooleanValue(result); | 443 bool c_result = Dart_IsBoolean(result) && DartUtils::GetBooleanValue(result); |
| 437 Dart_ExitScope(); | 444 Dart_ExitScope(); |
| 438 return c_result ? SECSuccess : SECFailure; | 445 return c_result ? SECSuccess : SECFailure; |
| 439 } | 446 } |
| 440 | 447 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 575 | 582 |
| 576 memio_SetPeerName(filter_, &host_address); | 583 memio_SetPeerName(filter_, &host_address); |
| 577 PR_FreeAddrInfo(info); | 584 PR_FreeAddrInfo(info); |
| 578 } | 585 } |
| 579 | 586 |
| 580 | 587 |
| 581 void SSLFilter::Handshake() { | 588 void SSLFilter::Handshake() { |
| 582 SECStatus status = SSL_ForceHandshake(filter_); | 589 SECStatus status = SSL_ForceHandshake(filter_); |
| 583 if (status == SECSuccess) { | 590 if (status == SECSuccess) { |
| 584 if (in_handshake_) { | 591 if (in_handshake_) { |
| 585 ThrowIfError(Dart_InvokeClosure(handshake_complete_, 0, NULL)); | 592 ThrowIfError(Dart_InvokeClosure(Dart_HandleFromPersistent(handshake_comple te_), 0, NULL)); |
| 586 in_handshake_ = false; | 593 in_handshake_ = false; |
| 587 } | 594 } |
| 588 } else { | 595 } else { |
| 589 PRErrorCode error = PR_GetError(); | 596 PRErrorCode error = PR_GetError(); |
| 590 if (error == PR_WOULD_BLOCK_ERROR) { | 597 if (error == PR_WOULD_BLOCK_ERROR) { |
| 591 if (!in_handshake_) { | 598 if (!in_handshake_) { |
| 592 in_handshake_ = true; | 599 in_handshake_ = true; |
| 593 } | 600 } |
| 594 } else { | 601 } else { |
| 595 if (is_server_) { | 602 if (is_server_) { |
| 596 ThrowPRException("Unexpected handshake error in server"); | 603 ThrowPRException("Unexpected handshake error in server"); |
| 597 } else { | 604 } else { |
| 598 ThrowPRException("Unexpected handshake error in client"); | 605 ThrowPRException("Unexpected handshake error in client"); |
| 599 } | 606 } |
| 600 } | 607 } |
| 601 } | 608 } |
| 602 } | 609 } |
| 603 | 610 |
| 604 | 611 |
| 605 void SSLFilter::Destroy() { | 612 void SSLFilter::Destroy() { |
| 606 for (int i = 0; i < kNumBuffers; ++i) { | 613 for (int i = 0; i < kNumBuffers; ++i) { |
| 607 Dart_DeletePersistentHandle(dart_buffer_objects_[i]); | 614 Dart_DeletePersistentHandle(dart_buffer_objects_[i]); |
| 608 delete[] buffers_[i]; | 615 delete[] buffers_[i]; |
| 609 } | 616 } |
| 610 Dart_DeletePersistentHandle(string_start_); | 617 Dart_DeletePersistentHandle(string_start_); |
| 611 Dart_DeletePersistentHandle(string_length_); | 618 Dart_DeletePersistentHandle(string_length_); |
| 612 Dart_DeletePersistentHandle(handshake_complete_); | 619 Dart_DeletePersistentHandle(handshake_complete_); |
| 613 if (bad_certificate_callback_ != NULL) { | 620 Dart_DeletePersistentHandle(bad_certificate_callback_); |
| 614 Dart_DeletePersistentHandle(bad_certificate_callback_); | |
| 615 } | |
| 616 free(client_certificate_name_); | 621 free(client_certificate_name_); |
| 617 | 622 |
| 618 PR_Close(filter_); | 623 PR_Close(filter_); |
| 619 } | 624 } |
| 620 | 625 |
| 621 | 626 |
| 622 intptr_t SSLFilter::ProcessBuffer(int buffer_index) { | 627 intptr_t SSLFilter::ProcessBuffer(int buffer_index) { |
| 623 int size = isEncrypted(buffer_index) ? encrypted_buffer_size_ : buffer_size_; | 628 int size = isEncrypted(buffer_index) ? encrypted_buffer_size_ : buffer_size_; |
| 624 Dart_Handle buffer_object = dart_buffer_objects_[buffer_index]; | 629 Dart_Handle buffer_object = Dart_HandleFromPersistent(dart_buffer_objects_[buf fer_index]); |
| 625 Dart_Handle start_object = ThrowIfError( | 630 Dart_Handle start_object = ThrowIfError( |
| 626 Dart_GetField(buffer_object, string_start_)); | 631 Dart_GetField(buffer_object, Dart_HandleFromPersistent(string_start_))); |
| 627 Dart_Handle length_object = ThrowIfError( | 632 Dart_Handle length_object = ThrowIfError( |
| 628 Dart_GetField(buffer_object, string_length_)); | 633 Dart_GetField(buffer_object, Dart_HandleFromPersistent(string_length_))); |
| 629 int64_t unsafe_start = DartUtils::GetIntegerValue(start_object); | 634 int64_t unsafe_start = DartUtils::GetIntegerValue(start_object); |
| 630 int64_t unsafe_length = DartUtils::GetIntegerValue(length_object); | 635 int64_t unsafe_length = DartUtils::GetIntegerValue(length_object); |
| 631 ASSERT(unsafe_start >= 0); | 636 ASSERT(unsafe_start >= 0); |
| 632 ASSERT(unsafe_start < size); | 637 ASSERT(unsafe_start < size); |
| 633 ASSERT(unsafe_length >= 0); | 638 ASSERT(unsafe_length >= 0); |
| 634 ASSERT(unsafe_length <= size); | 639 ASSERT(unsafe_length <= size); |
| 635 int start = static_cast<int>(unsafe_start); | 640 int start = static_cast<int>(unsafe_start); |
| 636 int length = static_cast<int>(unsafe_length); | 641 int length = static_cast<int>(unsafe_length); |
| 637 uint8_t* buffer = buffers_[buffer_index]; | 642 uint8_t* buffer = buffers_[buffer_index]; |
| 638 | 643 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 714 bytes_processed = 0; | 719 bytes_processed = 0; |
| 715 } | 720 } |
| 716 break; | 721 break; |
| 717 } | 722 } |
| 718 } | 723 } |
| 719 return bytes_processed; | 724 return bytes_processed; |
| 720 } | 725 } |
| 721 | 726 |
| 722 } // namespace bin | 727 } // namespace bin |
| 723 } // namespace dart | 728 } // namespace dart |
| OLD | NEW |