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

Side by Side Diff: webrtc/base/sslstreamadapter_unittest.cc

Issue 2163683003: Relanding: Allow the DTLS fingerprint verification to occur after the handshake. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Code cleanup based on comments from Matt. Setting DTLS state to "failed" on bad fingerprint. Created 4 years, 5 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 /* 1 /*
2 * Copyright 2011 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2011 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 318
319 if (sig & rtc::SE_READ) { 319 if (sig & rtc::SE_READ) {
320 ReadData(stream); 320 ReadData(stream);
321 } 321 }
322 322
323 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) { 323 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
324 WriteData(); 324 WriteData();
325 } 325 }
326 } 326 }
327 327
328 void SetPeerIdentitiesByDigest(bool correct) { 328 void SetPeerIdentitiesByDigest(bool correct, bool expect_success) {
329 unsigned char digest[20]; 329 unsigned char server_digest[20];
330 size_t digest_len; 330 size_t server_digest_len;
331 unsigned char client_digest[20];
332 size_t client_digest_len;
331 bool rv; 333 bool rv;
332 334
333 LOG(LS_INFO) << "Setting peer identities by digest"; 335 LOG(LS_INFO) << "Setting peer identities by digest";
334 336
335 rv = server_identity_->certificate().ComputeDigest(rtc::DIGEST_SHA_1, 337 rv = server_identity_->certificate().ComputeDigest(
336 digest, 20, 338 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
337 &digest_len);
338 ASSERT_TRUE(rv); 339 ASSERT_TRUE(rv);
340 rv = client_identity_->certificate().ComputeDigest(
341 rtc::DIGEST_SHA_1, client_digest, 20, &client_digest_len);
342 ASSERT_TRUE(rv);
343
339 if (!correct) { 344 if (!correct) {
340 LOG(LS_INFO) << "Setting bogus digest for server cert"; 345 LOG(LS_INFO) << "Setting bogus digest for server cert";
341 digest[0]++; 346 server_digest[0]++;
342 } 347 }
343 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest, 348 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
344 digest_len); 349 server_digest_len);
345 ASSERT_TRUE(rv); 350 EXPECT_EQ(expect_success, rv);
346 351
347
348 rv = client_identity_->certificate().ComputeDigest(rtc::DIGEST_SHA_1,
349 digest, 20, &digest_len);
350 ASSERT_TRUE(rv);
351 if (!correct) { 352 if (!correct) {
352 LOG(LS_INFO) << "Setting bogus digest for client cert"; 353 LOG(LS_INFO) << "Setting bogus digest for client cert";
353 digest[0]++; 354 client_digest[0]++;
354 } 355 }
355 rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest, 356 rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, client_digest,
356 digest_len); 357 client_digest_len);
357 ASSERT_TRUE(rv); 358 EXPECT_EQ(expect_success, rv);
358 359
359 identities_set_ = true; 360 identities_set_ = true;
360 } 361 }
361 362
362 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version, 363 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
363 rtc::SSLProtocolVersion client_version) { 364 rtc::SSLProtocolVersion client_version) {
364 server_ssl_->SetMaxProtocolVersion(server_version); 365 server_ssl_->SetMaxProtocolVersion(server_version);
365 client_ssl_->SetMaxProtocolVersion(client_version); 366 client_ssl_->SetMaxProtocolVersion(client_version);
366 } 367 }
367 368
368 void TestHandshake(bool expect_success = true) { 369 void TestHandshake(bool expect_success = true) {
369 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : 370 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
370 rtc::SSL_MODE_TLS); 371 rtc::SSL_MODE_TLS);
371 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : 372 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
372 rtc::SSL_MODE_TLS); 373 rtc::SSL_MODE_TLS);
373 374
374 if (!dtls_) { 375 if (!dtls_) {
375 // Make sure we simulate a reliable network for TLS. 376 // Make sure we simulate a reliable network for TLS.
376 // This is just a check to make sure that people don't write wrong 377 // This is just a check to make sure that people don't write wrong
377 // tests. 378 // tests.
378 ASSERT((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0)); 379 ASSERT((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
379 } 380 }
380 381
381 if (!identities_set_) 382 if (!identities_set_)
382 SetPeerIdentitiesByDigest(true); 383 SetPeerIdentitiesByDigest(true, true);
383 384
384 // Start the handshake 385 // Start the handshake
385 int rv; 386 int rv;
386 387
387 server_ssl_->SetServerRole(); 388 server_ssl_->SetServerRole();
388 rv = server_ssl_->StartSSLWithPeer(); 389 rv = server_ssl_->StartSSLWithPeer();
389 ASSERT_EQ(0, rv); 390 ASSERT_EQ(0, rv);
390 391
391 rv = client_ssl_->StartSSLWithPeer(); 392 rv = client_ssl_->StartSSLWithPeer();
392 ASSERT_EQ(0, rv); 393 ASSERT_EQ(0, rv);
393 394
394 // Now run the handshake 395 // Now run the handshake
395 if (expect_success) { 396 if (expect_success) {
396 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN) 397 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN)
397 && (server_ssl_->GetState() == rtc::SS_OPEN), 398 && (server_ssl_->GetState() == rtc::SS_OPEN),
398 handshake_wait_); 399 handshake_wait_);
399 } else { 400 } else {
400 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED, 401 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
401 handshake_wait_); 402 handshake_wait_);
402 } 403 }
403 } 404 }
404 405
406 // This tests that the handshake can complete before the identity is
407 // verified, and the identity will be verified after the fact.
408 void TestHandshakeWithDelayedIdentity(bool valid_identity) {
409 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
410 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
411
412 if (!dtls_) {
413 // Make sure we simulate a reliable network for TLS.
414 // This is just a check to make sure that people don't write wrong
415 // tests.
416 ASSERT((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
417 }
418
419 // Start the handshake
420 int rv;
421
422 server_ssl_->SetServerRole();
423 rv = server_ssl_->StartSSLWithPeer();
424 ASSERT_EQ(0, rv);
425
426 rv = client_ssl_->StartSSLWithPeer();
427 ASSERT_EQ(0, rv);
428
429 // Now run the handshake.
430 EXPECT_TRUE_WAIT(
431 client_ssl_->IsTlsConnected() && server_ssl_->IsTlsConnected(),
432 handshake_wait_);
433
434 // Until the identity has been verified, the state should still be
435 // SS_OPENING and writes should return SR_BLOCK.
436 EXPECT_EQ(rtc::SS_OPENING, client_ssl_->GetState());
437 EXPECT_EQ(rtc::SS_OPENING, server_ssl_->GetState());
438 unsigned char packet[1];
439 size_t sent;
440 EXPECT_EQ(rtc::SR_BLOCK, client_ssl_->Write(&packet, 1, &sent, 0));
441 EXPECT_EQ(rtc::SR_BLOCK, server_ssl_->Write(&packet, 1, &sent, 0));
442
443 // If we set an invalid identity at this point, SetPeerCertificateDigest
444 // should return false.
445 SetPeerIdentitiesByDigest(valid_identity, valid_identity);
446 // State should then transition to SS_OPEN or SS_CLOSED based on validation
447 // of the identity.
448 if (valid_identity) {
449 EXPECT_EQ(rtc::SS_OPEN, client_ssl_->GetState());
450 EXPECT_EQ(rtc::SS_OPEN, server_ssl_->GetState());
451 } else {
452 EXPECT_EQ(rtc::SS_CLOSED, client_ssl_->GetState());
453 EXPECT_EQ(rtc::SS_CLOSED, server_ssl_->GetState());
454 }
455 }
456
405 rtc::StreamResult DataWritten(SSLDummyStreamBase *from, const void *data, 457 rtc::StreamResult DataWritten(SSLDummyStreamBase *from, const void *data,
406 size_t data_len, size_t *written, 458 size_t data_len, size_t *written,
407 int *error) { 459 int *error) {
408 // Randomly drop loss_ percent of packets 460 // Randomly drop loss_ percent of packets
409 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) { 461 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
410 LOG(LS_INFO) << "Randomly dropping packet, size=" << data_len; 462 LOG(LS_INFO) << "Randomly dropping packet, size=" << data_len;
411 *written = data_len; 463 *written = data_len;
412 return rtc::SR_SUCCESS; 464 return rtc::SR_SUCCESS;
413 } 465 }
414 if (dtls_ && (data_len > mtu_)) { 466 if (dtls_ && (data_len > mtu_)) {
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
842 rv = client_ssl_->Write(block, sizeof(block), &dummy, NULL); 894 rv = client_ssl_->Write(block, sizeof(block), &dummy, NULL);
843 ASSERT_EQ(rtc::SR_ERROR, rv); 895 ASSERT_EQ(rtc::SR_ERROR, rv);
844 896
845 // But after closed read gives you EOS. 897 // But after closed read gives you EOS.
846 rv = client_ssl_->Read(block, sizeof(block), &dummy, NULL); 898 rv = client_ssl_->Read(block, sizeof(block), &dummy, NULL);
847 ASSERT_EQ(rtc::SR_EOS, rv); 899 ASSERT_EQ(rtc::SR_EOS, rv);
848 }; 900 };
849 901
850 // Test a handshake with a bogus peer digest 902 // Test a handshake with a bogus peer digest
851 TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) { 903 TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
852 SetPeerIdentitiesByDigest(false); 904 SetPeerIdentitiesByDigest(false, true);
853 TestHandshake(false); 905 TestHandshake(false);
854 }; 906 };
855 907
908 TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentity) {
909 TestHandshakeWithDelayedIdentity(true);
910 };
911
912 TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentityWithBogusDigest) {
913 TestHandshakeWithDelayedIdentity(false);
914 };
915
856 // Test moving a bunch of data 916 // Test moving a bunch of data
857 917
858 // Basic tests: DTLS 918 // Basic tests: DTLS
859 // Test that we can make a handshake work 919 // Test that we can make a handshake work
860 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) { 920 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
861 MAYBE_SKIP_TEST(HaveDtls); 921 MAYBE_SKIP_TEST(HaveDtls);
862 TestHandshake(); 922 TestHandshake();
863 }; 923 };
864 924
865 // Test that we can make a handshake work if the first packet in 925 // Test that we can make a handshake work if the first packet in
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
904 }; 964 };
905 965
906 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) { 966 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) {
907 MAYBE_SKIP_TEST(HaveDtls); 967 MAYBE_SKIP_TEST(HaveDtls);
908 SetDamage(); // Must be called first because first packet 968 SetDamage(); // Must be called first because first packet
909 // write happens at end of handshake. 969 // write happens at end of handshake.
910 TestHandshake(); 970 TestHandshake();
911 TestTransfer(100); 971 TestTransfer(100);
912 }; 972 };
913 973
974 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentity) {
975 TestHandshakeWithDelayedIdentity(true);
976 };
977
978 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentityWithBogusDigest) {
979 TestHandshakeWithDelayedIdentity(false);
980 };
981
914 // Test DTLS-SRTP with all high ciphers 982 // Test DTLS-SRTP with all high ciphers
915 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) { 983 TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
916 MAYBE_SKIP_TEST(HaveDtlsSrtp); 984 MAYBE_SKIP_TEST(HaveDtlsSrtp);
917 std::vector<int> high; 985 std::vector<int> high;
918 high.push_back(rtc::SRTP_AES128_CM_SHA1_80); 986 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
919 SetDtlsSrtpCryptoSuites(high, true); 987 SetDtlsSrtpCryptoSuites(high, true);
920 SetDtlsSrtpCryptoSuites(high, false); 988 SetDtlsSrtpCryptoSuites(high, false);
921 TestHandshake(); 989 TestHandshake();
922 990
923 int client_cipher; 991 int client_cipher;
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); 1226 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
1159 INSTANTIATE_TEST_CASE_P( 1227 INSTANTIATE_TEST_CASE_P(
1160 SSLStreamAdapterTestsDTLS, 1228 SSLStreamAdapterTestsDTLS,
1161 SSLStreamAdapterTestDTLS, 1229 SSLStreamAdapterTestDTLS,
1162 Combine(Values(rtc::KeyParams::RSA(1024, 65537), 1230 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1163 rtc::KeyParams::RSA(1152, 65537), 1231 rtc::KeyParams::RSA(1152, 65537),
1164 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)), 1232 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1165 Values(rtc::KeyParams::RSA(1024, 65537), 1233 Values(rtc::KeyParams::RSA(1024, 65537),
1166 rtc::KeyParams::RSA(1152, 65537), 1234 rtc::KeyParams::RSA(1152, 65537),
1167 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); 1235 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698