| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 package org.chromium.net; | 5 package org.chromium.net; |
| 6 | 6 |
| 7 import android.test.suitebuilder.annotation.SmallTest; | 7 import android.test.suitebuilder.annotation.SmallTest; |
| 8 | 8 |
| 9 import org.json.JSONObject; |
| 10 |
| 9 import org.chromium.base.test.util.Feature; | 11 import org.chromium.base.test.util.Feature; |
| 10 import org.chromium.net.test.util.CertTestUtil; | 12 import org.chromium.net.test.util.CertTestUtil; |
| 11 import org.json.JSONObject; | |
| 12 | 13 |
| 13 import java.io.ByteArrayInputStream; | 14 import java.io.ByteArrayInputStream; |
| 14 import java.security.cert.CertificateFactory; | 15 import java.security.cert.CertificateFactory; |
| 15 import java.security.cert.X509Certificate; | 16 import java.security.cert.X509Certificate; |
| 16 import java.util.Arrays; | 17 import java.util.Arrays; |
| 17 import java.util.Calendar; | 18 import java.util.Calendar; |
| 18 import java.util.Date; | 19 import java.util.Date; |
| 19 import java.util.HashSet; | 20 import java.util.HashSet; |
| 20 import java.util.Set; | 21 import java.util.Set; |
| 21 | 22 |
| 22 /** | 23 /** |
| 23 * Public-Key-Pinning tests of Cronet Java API. | 24 * Public-Key-Pinning tests of Cronet Java API. |
| 24 */ | 25 */ |
| 25 public class PkpTest extends CronetTestBase { | 26 public class PkpTest extends CronetTestBase { |
| 26 private static final String CERT_USED = "quic_test.example.com.crt"; | 27 private static final String CERT_USED = "quic_test.example.com.crt"; |
| 27 private static final String[] CERTS_USED = {CERT_USED}; | 28 private static final String[] CERTS_USED = {CERT_USED}; |
| 28 private static final int DISTANT_FUTURE = Integer.MAX_VALUE; | 29 private static final int DISTANT_FUTURE = Integer.MAX_VALUE; |
| 29 private static final boolean INCLUDE_SUBDOMAINS = true; | 30 private static final boolean INCLUDE_SUBDOMAINS = true; |
| 30 private static final boolean EXCLUDE_SUBDOMAINS = false; | 31 private static final boolean EXCLUDE_SUBDOMAINS = false; |
| 31 private static final boolean KNOWN_ROOT = true; | 32 private static final boolean KNOWN_ROOT = true; |
| 32 private static final boolean UNKNOWN_ROOT = false; | 33 private static final boolean UNKNOWN_ROOT = false; |
| 33 private static final boolean ENABLE_PINNING_BYPASS_FOR_LOCAL_ANCHORS = true; | 34 private static final boolean ENABLE_PINNING_BYPASS_FOR_LOCAL_ANCHORS = true; |
| 34 private static final boolean DISABLE_PINNING_BYPASS_FOR_LOCAL_ANCHORS = fals
e; | 35 private static final boolean DISABLE_PINNING_BYPASS_FOR_LOCAL_ANCHORS = fals
e; |
| 35 | 36 |
| 36 private CronetTestFramework mTestFramework; | 37 private CronetTestFramework mTestFramework; |
| 37 private CronetEngine.Builder mBuilder; | 38 private ExperimentalCronetEngine.Builder mBuilder; |
| 38 private TestUrlRequestCallback mListener; | 39 private TestUrlRequestCallback mListener; |
| 39 private String mServerUrl; // https://test.example.com:6121 | 40 private String mServerUrl; // https://test.example.com:6121 |
| 40 private String mServerHost; // test.example.com | 41 private String mServerHost; // test.example.com |
| 41 private String mDomain; // example.com | 42 private String mDomain; // example.com |
| 42 | 43 |
| 43 @Override | 44 @Override |
| 44 protected void setUp() throws Exception { | 45 protected void setUp() throws Exception { |
| 45 super.setUp(); | 46 super.setUp(); |
| 46 // Start QUIC Test Server | 47 // Start QUIC Test Server |
| 47 System.loadLibrary("cronet_tests"); | 48 System.loadLibrary("cronet_tests"); |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 fail("Did not expect an error but got error code " | 381 fail("Did not expect an error but got error code " |
| 381 + mListener.mError.getCronetInternalErrorCode()); | 382 + mListener.mError.getCronetInternalErrorCode()); |
| 382 } | 383 } |
| 383 assertNotNull("Expected non-null response from the server", mListener.mR
esponseInfo); | 384 assertNotNull("Expected non-null response from the server", mListener.mR
esponseInfo); |
| 384 assertEquals(200, mListener.mResponseInfo.getHttpStatusCode()); | 385 assertEquals(200, mListener.mResponseInfo.getHttpStatusCode()); |
| 385 } | 386 } |
| 386 | 387 |
| 387 private void createCronetEngineBuilder(boolean bypassPinningForLocalAnchors,
boolean knownRoot) | 388 private void createCronetEngineBuilder(boolean bypassPinningForLocalAnchors,
boolean knownRoot) |
| 388 throws Exception { | 389 throws Exception { |
| 389 // Set common CronetEngine parameters | 390 // Set common CronetEngine parameters |
| 390 mBuilder = new CronetEngine.Builder(getContext()); | 391 mBuilder = new ExperimentalCronetEngine.Builder(getContext()); |
| 391 mBuilder.enablePublicKeyPinningBypassForLocalTrustAnchors(bypassPinningF
orLocalAnchors); | 392 mBuilder.enablePublicKeyPinningBypassForLocalTrustAnchors(bypassPinningF
orLocalAnchors); |
| 392 mBuilder.enableQuic(true); | 393 mBuilder.enableQuic(true); |
| 393 mBuilder.addQuicHint(QuicTestServer.getServerHost(), QuicTestServer.getS
erverPort(), | 394 mBuilder.addQuicHint(QuicTestServer.getServerHost(), QuicTestServer.getS
erverPort(), |
| 394 QuicTestServer.getServerPort()); | 395 QuicTestServer.getServerPort()); |
| 395 JSONObject quicParams = new JSONObject().put("host_whitelist", "test.exa
mple.com"); | 396 JSONObject quicParams = new JSONObject().put("host_whitelist", "test.exa
mple.com"); |
| 396 JSONObject hostResolverParams = CronetTestUtil.generateHostResolverRules
(); | 397 JSONObject hostResolverParams = CronetTestUtil.generateHostResolverRules
(); |
| 397 JSONObject experimentalOptions = new JSONObject() | 398 JSONObject experimentalOptions = new JSONObject() |
| 398 .put("QUIC", quicParams) | 399 .put("QUIC", quicParams) |
| 399 .put("HostResolverRules", hostR
esolverParams); | 400 .put("HostResolverRules", hostR
esolverParams); |
| 400 mBuilder.setExperimentalOptions(experimentalOptions.toString()); | 401 mBuilder.setExperimentalOptions(experimentalOptions.toString()); |
| 401 mBuilder.setStoragePath(CronetTestFramework.getTestStorage(getContext())
); | 402 mBuilder.setStoragePath(CronetTestFramework.getTestStorage(getContext())
); |
| 402 mBuilder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 1
000 * 1024); | 403 mBuilder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 1
000 * 1024); |
| 403 mBuilder.setMockCertVerifierForTesting( | 404 CronetTestUtil.setMockCertVerifierForTesting( |
| 404 MockCertVerifier.createMockCertVerifier(CERTS_USED, knownRoot)); | 405 mBuilder, MockCertVerifier.createMockCertVerifier(CERTS_USED, kn
ownRoot)); |
| 405 } | 406 } |
| 406 | 407 |
| 407 private void startCronetFramework() { | 408 private void startCronetFramework() { |
| 408 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n
ull, mBuilder); | 409 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n
ull, mBuilder); |
| 409 } | 410 } |
| 410 | 411 |
| 411 private void shutdownCronetEngine() { | 412 private void shutdownCronetEngine() { |
| 412 if (mTestFramework != null && mTestFramework.mCronetEngine != null) { | 413 if (mTestFramework != null && mTestFramework.mCronetEngine != null) { |
| 413 mTestFramework.mCronetEngine.shutdown(); | 414 mTestFramework.mCronetEngine.shutdown(); |
| 414 } | 415 } |
| 415 } | 416 } |
| 416 | 417 |
| 417 private byte[] generateSomeSha256() { | 418 private byte[] generateSomeSha256() { |
| 418 byte[] sha256 = new byte[32]; | 419 byte[] sha256 = new byte[32]; |
| 419 Arrays.fill(sha256, (byte) 58); | 420 Arrays.fill(sha256, (byte) 58); |
| 420 return sha256; | 421 return sha256; |
| 421 } | 422 } |
| 422 | 423 |
| 423 private void addPkpSha256( | 424 private void addPkpSha256( |
| 424 String host, byte[] pinHashValue, boolean includeSubdomain, int maxA
geInSec) { | 425 String host, byte[] pinHashValue, boolean includeSubdomain, int maxA
geInSec) { |
| 425 Set<byte[]> hashes = new HashSet<>(); | 426 Set<byte[]> hashes = new HashSet<>(); |
| 426 hashes.add(pinHashValue); | 427 hashes.add(pinHashValue); |
| 427 mBuilder.addPublicKeyPins(host, hashes, includeSubdomain, dateInFuture(m
axAgeInSec)); | 428 mBuilder.addPublicKeyPins(host, hashes, includeSubdomain, dateInFuture(m
axAgeInSec)); |
| 428 } | 429 } |
| 429 | 430 |
| 430 private void sendRequestAndWaitForResult() { | 431 private void sendRequestAndWaitForResult() { |
| 431 mListener = new TestUrlRequestCallback(); | 432 mListener = new TestUrlRequestCallback(); |
| 432 | 433 |
| 433 String quicURL = mServerUrl + "/simple.txt"; | 434 String quicURL = mServerUrl + "/simple.txt"; |
| 434 UrlRequest.Builder requestBuilder = new UrlRequest.Builder( | 435 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR
equestBuilder( |
| 435 quicURL, mListener, mListener.getExecutor(), mTestFramework.mCro
netEngine); | 436 quicURL, mListener, mListener.getExecutor()); |
| 436 requestBuilder.build().start(); | 437 requestBuilder.build().start(); |
| 437 mListener.blockForDone(); | 438 mListener.blockForDone(); |
| 438 } | 439 } |
| 439 | 440 |
| 440 private X509Certificate readCertFromFileInPemFormat(String certFileName) thr
ows Exception { | 441 private X509Certificate readCertFromFileInPemFormat(String certFileName) thr
ows Exception { |
| 441 byte[] certDer = CertTestUtil.pemToDer(CertTestUtil.CERTS_DIRECTORY + ce
rtFileName); | 442 byte[] certDer = CertTestUtil.pemToDer(CertTestUtil.CERTS_DIRECTORY + ce
rtFileName); |
| 442 CertificateFactory certFactory = CertificateFactory.getInstance("X.509")
; | 443 CertificateFactory certFactory = CertificateFactory.getInstance("X.509")
; |
| 443 return (X509Certificate) certFactory.generateCertificate(new ByteArrayIn
putStream(certDer)); | 444 return (X509Certificate) certFactory.generateCertificate(new ByteArrayIn
putStream(certDer)); |
| 444 } | 445 } |
| 445 | 446 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 if (!shouldThrowNpe) { | 482 if (!shouldThrowNpe) { |
| 482 fail("Null pointer exception was not expected: " + ex.toString()
); | 483 fail("Null pointer exception was not expected: " + ex.toString()
); |
| 483 } | 484 } |
| 484 return; | 485 return; |
| 485 } | 486 } |
| 486 if (shouldThrowNpe) { | 487 if (shouldThrowNpe) { |
| 487 fail("NullPointerException was expected"); | 488 fail("NullPointerException was expected"); |
| 488 } | 489 } |
| 489 } | 490 } |
| 490 } | 491 } |
| OLD | NEW |