Merge "Move apache HTTP tests out of tests/net"
This commit is contained in:
@@ -21,7 +21,6 @@ java_defaults {
|
|||||||
|
|
||||||
libs: [
|
libs: [
|
||||||
"voip-common",
|
"voip-common",
|
||||||
"org.apache.http.legacy",
|
|
||||||
"android.test.base",
|
"android.test.base",
|
||||||
],
|
],
|
||||||
|
|
||||||
@@ -40,14 +39,11 @@ java_defaults {
|
|||||||
static_libs: [
|
static_libs: [
|
||||||
"FrameworksNetCommonTests",
|
"FrameworksNetCommonTests",
|
||||||
"TestNetworkStackLib",
|
"TestNetworkStackLib",
|
||||||
"compatibility-device-util-axt",
|
|
||||||
"core-tests-support",
|
"core-tests-support",
|
||||||
"cts-net-utils",
|
"cts-net-utils",
|
||||||
"ctstestrunner-axt",
|
"ctstestrunner-axt",
|
||||||
"ctstestserver",
|
|
||||||
"junit",
|
"junit",
|
||||||
"junit-params",
|
"junit-params",
|
||||||
"mockwebserver",
|
|
||||||
"net-utils-framework-common",
|
"net-utils-framework-common",
|
||||||
"truth-prebuilt",
|
"truth-prebuilt",
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,95 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2011 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package android.net.http.cts;
|
|
||||||
|
|
||||||
import org.apache.http.HttpResponse;
|
|
||||||
import org.apache.http.client.ClientProtocolException;
|
|
||||||
import org.apache.http.client.HttpClient;
|
|
||||||
import org.apache.http.client.methods.HttpGet;
|
|
||||||
import org.apache.http.impl.client.DefaultHttpClient;
|
|
||||||
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.platform.test.annotations.AppModeFull;
|
|
||||||
import android.test.AndroidTestCase;
|
|
||||||
import android.webkit.cts.CtsTestServer;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@AppModeFull(reason = "Socket cannot bind in instant app mode")
|
|
||||||
public class ApacheHttpClientTest extends AndroidTestCase {
|
|
||||||
|
|
||||||
private static final int NUM_DOWNLOADS = 20;
|
|
||||||
|
|
||||||
private static final int SMALL_DOWNLOAD_SIZE = 100 * 1024;
|
|
||||||
|
|
||||||
private CtsTestServer mWebServer;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setUp() throws Exception {
|
|
||||||
super.setUp();
|
|
||||||
mWebServer = new CtsTestServer(mContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void tearDown() throws Exception {
|
|
||||||
super.tearDown();
|
|
||||||
mWebServer.shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testExecute() throws Exception {
|
|
||||||
downloadMultipleFiles();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void downloadMultipleFiles() throws ClientProtocolException, IOException {
|
|
||||||
List<HttpResponse> responses = new ArrayList<HttpResponse>();
|
|
||||||
for (int i = 0; i < NUM_DOWNLOADS; i++) {
|
|
||||||
HttpClient httpClient = new DefaultHttpClient();
|
|
||||||
HttpGet request = new HttpGet(getSmallDownloadUrl(i).toString());
|
|
||||||
HttpResponse response = httpClient.execute(request);
|
|
||||||
responses.add(response);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < NUM_DOWNLOADS; i++) {
|
|
||||||
assertDownloadResponse("Download " + i, SMALL_DOWNLOAD_SIZE, responses.get(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Uri getSmallDownloadUrl(int index) {
|
|
||||||
return Uri.parse(mWebServer.getTestDownloadUrl("cts-small-download-" + index,
|
|
||||||
SMALL_DOWNLOAD_SIZE));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void assertDownloadResponse(String message, int expectedNumBytes, HttpResponse response)
|
|
||||||
throws IllegalStateException, IOException {
|
|
||||||
byte[] buffer = new byte[4096];
|
|
||||||
assertEquals(200, response.getStatusLine().getStatusCode());
|
|
||||||
|
|
||||||
InputStream stream = response.getEntity().getContent();
|
|
||||||
int numBytes = 0;
|
|
||||||
while (true) {
|
|
||||||
int bytesRead = stream.read(buffer);
|
|
||||||
if (bytesRead < 0) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
numBytes += bytesRead;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assertEquals(message, expectedNumBytes, numBytes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,162 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2011 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package android.net.http.cts;
|
|
||||||
|
|
||||||
import com.google.mockwebserver.MockResponse;
|
|
||||||
import com.google.mockwebserver.MockWebServer;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
import android.net.http.HttpResponseCache;
|
|
||||||
import android.platform.test.annotations.AppModeFull;
|
|
||||||
|
|
||||||
import com.android.compatibility.common.util.FileUtils;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.net.CacheRequest;
|
|
||||||
import java.net.CacheResponse;
|
|
||||||
import java.net.ResponseCache;
|
|
||||||
import java.net.URI;
|
|
||||||
import java.net.URLConnection;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public final class HttpResponseCacheTest extends TestCase {
|
|
||||||
|
|
||||||
private File cacheDir;
|
|
||||||
private MockWebServer server;
|
|
||||||
|
|
||||||
@Override public void setUp() throws Exception {
|
|
||||||
super.setUp();
|
|
||||||
server = new MockWebServer();
|
|
||||||
String tmp = System.getProperty("java.io.tmpdir");
|
|
||||||
cacheDir = new File(tmp, "HttpCache-" + UUID.randomUUID());
|
|
||||||
cacheDir.mkdirs();
|
|
||||||
// Make the cache directory read / writable.
|
|
||||||
FileUtils.setPermissions(cacheDir.getPath(), 0777);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override protected void tearDown() throws Exception {
|
|
||||||
ResponseCache.setDefault(null);
|
|
||||||
server.shutdown();
|
|
||||||
super.tearDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testInstall() throws Exception {
|
|
||||||
HttpResponseCache installed = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
|
|
||||||
assertNotNull(installed);
|
|
||||||
assertSame(installed, ResponseCache.getDefault());
|
|
||||||
assertSame(installed, HttpResponseCache.getDefault());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testSecondEquivalentInstallDoesNothing() throws Exception {
|
|
||||||
HttpResponseCache first = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
|
|
||||||
HttpResponseCache another = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
|
|
||||||
assertSame(first, another);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testInstallClosesPreviouslyInstalled() throws Exception {
|
|
||||||
HttpResponseCache first = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
|
|
||||||
initializeCache(first);
|
|
||||||
|
|
||||||
HttpResponseCache another = HttpResponseCache.install(cacheDir, 8 * 1024 * 1024);
|
|
||||||
initializeCache(first);
|
|
||||||
|
|
||||||
assertNotSame(first, another);
|
|
||||||
try {
|
|
||||||
first.flush();
|
|
||||||
fail();
|
|
||||||
} catch (IllegalStateException expected) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetInstalledWithWrongTypeInstalled() {
|
|
||||||
ResponseCache.setDefault(new ResponseCache() {
|
|
||||||
@Override public CacheResponse get(URI uri, String requestMethod,
|
|
||||||
Map<String, List<String>> requestHeaders) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
@Override public CacheRequest put(URI uri, URLConnection connection) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
assertNull(HttpResponseCache.getInstalled());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testCloseCloses() throws Exception {
|
|
||||||
HttpResponseCache cache = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
|
|
||||||
initializeCache(cache);
|
|
||||||
|
|
||||||
cache.close();
|
|
||||||
try {
|
|
||||||
cache.flush();
|
|
||||||
fail();
|
|
||||||
} catch (IllegalStateException expected) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testCloseUninstalls() throws Exception {
|
|
||||||
HttpResponseCache cache = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
|
|
||||||
cache.close();
|
|
||||||
assertNull(ResponseCache.getDefault());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testDeleteUninstalls() throws Exception {
|
|
||||||
HttpResponseCache cache = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
|
|
||||||
cache.delete();
|
|
||||||
assertNull(ResponseCache.getDefault());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make sure that statistics tracking are wired all the way through the
|
|
||||||
* wrapper class. http://code.google.com/p/android/issues/detail?id=25418
|
|
||||||
*/
|
|
||||||
@AppModeFull(reason = "Socket cannot bind in instant app mode")
|
|
||||||
public void testStatisticsTracking() throws Exception {
|
|
||||||
HttpResponseCache cache = HttpResponseCache.install(cacheDir, 10 * 1024 * 1024);
|
|
||||||
|
|
||||||
server.enqueue(new MockResponse()
|
|
||||||
.addHeader("Cache-Control: max-age=60")
|
|
||||||
.setBody("A"));
|
|
||||||
server.play();
|
|
||||||
|
|
||||||
URLConnection c1 = server.getUrl("/").openConnection();
|
|
||||||
InputStream inputStream1 = c1.getInputStream();
|
|
||||||
assertEquals('A', inputStream1.read());
|
|
||||||
inputStream1.close();
|
|
||||||
|
|
||||||
assertEquals(1, cache.getRequestCount());
|
|
||||||
assertEquals(1, cache.getNetworkCount());
|
|
||||||
assertEquals(0, cache.getHitCount());
|
|
||||||
|
|
||||||
URLConnection c2 = server.getUrl("/").openConnection();
|
|
||||||
assertEquals('A', c2.getInputStream().read());
|
|
||||||
|
|
||||||
URLConnection c3 = server.getUrl("/").openConnection();
|
|
||||||
assertEquals('A', c3.getInputStream().read());
|
|
||||||
assertEquals(3, cache.getRequestCount());
|
|
||||||
assertEquals(1, cache.getNetworkCount());
|
|
||||||
assertEquals(2, cache.getHitCount());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeCache(HttpResponseCache cache) {
|
|
||||||
// Ensure the cache is initialized, otherwise various methods are no-ops.
|
|
||||||
cache.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,248 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package android.net.http.cts;
|
|
||||||
|
|
||||||
import java.math.BigInteger;
|
|
||||||
import java.security.InvalidKeyException;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.security.NoSuchProviderException;
|
|
||||||
import java.security.Principal;
|
|
||||||
import java.security.PublicKey;
|
|
||||||
import java.security.SignatureException;
|
|
||||||
import java.security.cert.CertificateEncodingException;
|
|
||||||
import java.security.cert.CertificateException;
|
|
||||||
import java.security.cert.CertificateExpiredException;
|
|
||||||
import java.security.cert.CertificateNotYetValidException;
|
|
||||||
import java.security.cert.X509Certificate;
|
|
||||||
import java.text.DateFormat;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
import android.net.http.SslCertificate;
|
|
||||||
import android.net.http.SslCertificate.DName;
|
|
||||||
import android.os.Bundle;
|
|
||||||
|
|
||||||
public class SslCertificateTest extends TestCase {
|
|
||||||
|
|
||||||
public void testConstructor() {
|
|
||||||
// new the SslCertificate instance
|
|
||||||
String date = DateFormat.getInstance().format(new Date());
|
|
||||||
new SslCertificate("c=129", "e=weji", date, date);
|
|
||||||
|
|
||||||
// new the SslCertificate instance
|
|
||||||
new SslCertificate(new MockX509Certificate());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class MockX509Certificate extends X509Certificate {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void checkValidity() throws CertificateExpiredException,
|
|
||||||
CertificateNotYetValidException {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void checkValidity(Date date) throws CertificateExpiredException,
|
|
||||||
CertificateNotYetValidException {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getBasicConstraints() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Principal getIssuerDN() {
|
|
||||||
return new MockPrincipal();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean[] getIssuerUniqueID() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean[] getKeyUsage() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Date getNotAfter() {
|
|
||||||
return new Date(System.currentTimeMillis());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Date getNotBefore() {
|
|
||||||
return new Date(System.currentTimeMillis() - 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BigInteger getSerialNumber() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSigAlgName() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSigAlgOID() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] getSigAlgParams() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] getSignature() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Principal getSubjectDN() {
|
|
||||||
return new MockPrincipal();
|
|
||||||
}
|
|
||||||
|
|
||||||
class MockPrincipal implements Principal {
|
|
||||||
public String getName() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public boolean[] getSubjectUniqueID() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] getTBSCertificate() throws CertificateEncodingException {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getVersion() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] getEncoded() throws CertificateEncodingException {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PublicKey getPublicKey() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void verify(PublicKey key) throws CertificateException, NoSuchAlgorithmException,
|
|
||||||
InvalidKeyException, NoSuchProviderException, SignatureException {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void verify(PublicKey key, String sigProvider) throws CertificateException,
|
|
||||||
NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException,
|
|
||||||
SignatureException {
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> getCriticalExtensionOIDs() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte[] getExtensionValue(String oid) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> getNonCriticalExtensionOIDs() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasUnsupportedCriticalExtension() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testState() {
|
|
||||||
// set the expected value
|
|
||||||
|
|
||||||
Date date1 = new Date(System.currentTimeMillis() - 1000);
|
|
||||||
Date date2 = new Date(System.currentTimeMillis());
|
|
||||||
SslCertificate ssl = new SslCertificate("c=129", "e=weji", date1, date2);
|
|
||||||
Bundle saved = SslCertificate.saveState(ssl);
|
|
||||||
assertTrue(saved.size() == 4);
|
|
||||||
|
|
||||||
assertNotNull(saved.getString("issued-to"));
|
|
||||||
assertNotNull(saved.getString("issued-by"));
|
|
||||||
assertNotNull(saved.getString("valid-not-before"));
|
|
||||||
assertNotNull(saved.getString("valid-not-after"));
|
|
||||||
assertNull(SslCertificate.saveState(null));
|
|
||||||
|
|
||||||
SslCertificate restored = SslCertificate.restoreState(saved);
|
|
||||||
assertEquals(ssl.getValidNotAfter(), restored.getValidNotAfter());
|
|
||||||
assertEquals(ssl.getValidNotBefore(), restored.getValidNotBefore());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testSslCertificate() {
|
|
||||||
|
|
||||||
final String TO = "c=ccc,o=testOName,ou=testUName,cn=testCName";
|
|
||||||
final String BY = "e=aeei,c=adb,o=testOName,ou=testUName,cn=testCName";
|
|
||||||
// new the SslCertificate instance
|
|
||||||
Date date1 = new Date(System.currentTimeMillis() - 1000);
|
|
||||||
Date date2 = new Date(System.currentTimeMillis());
|
|
||||||
SslCertificate ssl = new SslCertificate(TO, BY, date1, date2);
|
|
||||||
DName issuedTo = ssl.getIssuedTo();
|
|
||||||
DName issuedBy = ssl.getIssuedBy();
|
|
||||||
|
|
||||||
assertEquals("testCName", issuedTo.getCName());
|
|
||||||
assertEquals(TO, issuedTo.getDName());
|
|
||||||
assertEquals("testOName", issuedTo.getOName());
|
|
||||||
assertEquals("testUName", issuedTo.getUName());
|
|
||||||
|
|
||||||
assertEquals("testCName", issuedBy.getCName());
|
|
||||||
assertEquals(BY, issuedBy.getDName());
|
|
||||||
assertEquals("testOName", issuedBy.getOName());
|
|
||||||
assertEquals("testUName", issuedBy.getUName());
|
|
||||||
|
|
||||||
assertEquals(date1, ssl.getValidNotBeforeDate());
|
|
||||||
assertEquals(date2, ssl.getValidNotAfterDate());
|
|
||||||
final String EXPECTED = "Issued to: c=ccc,o=testOName,ou=testUName,cn=testCName;\n"
|
|
||||||
+ "Issued by: e=aeei,c=adb,o=testOName,ou=testUName,cn=testCName;\n";
|
|
||||||
assertEquals(EXPECTED, ssl.toString());
|
|
||||||
assertNull(ssl.getX509Certificate());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetX509Certificate() {
|
|
||||||
final String TO = "c=ccc,o=testOName,ou=testUName,cn=testCName";
|
|
||||||
final String BY = "e=aeei,c=adb,o=testOName,ou=testUName,cn=testCName";
|
|
||||||
Date validNotBefore = new Date(System.currentTimeMillis() - 1000);
|
|
||||||
Date validNotAfter = new Date(System.currentTimeMillis());
|
|
||||||
SslCertificate ssl = new SslCertificate(TO, BY, validNotBefore, validNotAfter);
|
|
||||||
assertNull(ssl.getX509Certificate());
|
|
||||||
|
|
||||||
X509Certificate cert = new MockX509Certificate();
|
|
||||||
ssl = new SslCertificate(cert);
|
|
||||||
assertSame(cert, ssl.getX509Certificate());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package android.net.http.cts;
|
|
||||||
|
|
||||||
import java.text.DateFormat;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
import android.net.http.SslCertificate;
|
|
||||||
import android.net.http.SslCertificate.DName;
|
|
||||||
|
|
||||||
public class SslCertificate_DNameTest extends TestCase {
|
|
||||||
|
|
||||||
public void testDName() {
|
|
||||||
final String TO = "c=ccc,o=testOName,ou=testUName,cn=testCName";
|
|
||||||
final String BY = "e=aeei,c=adb,o=testOName,ou=testUName,cn=testCName";
|
|
||||||
// new the SslCertificate instance
|
|
||||||
Date date1 = new Date(System.currentTimeMillis() - 1000);
|
|
||||||
Date date2 = new Date(System.currentTimeMillis());
|
|
||||||
SslCertificate ssl = new SslCertificate(TO, BY, DateFormat.getInstance().format(
|
|
||||||
date1), DateFormat.getInstance().format(date2));
|
|
||||||
DName issuedTo = ssl.getIssuedTo();
|
|
||||||
|
|
||||||
assertNotNull(issuedTo);
|
|
||||||
|
|
||||||
assertEquals("testCName", issuedTo.getCName());
|
|
||||||
assertEquals(TO, issuedTo.getDName());
|
|
||||||
assertEquals("testOName", issuedTo.getOName());
|
|
||||||
assertEquals("testUName", issuedTo.getUName());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2011 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package android.net.http.cts;
|
|
||||||
|
|
||||||
import android.net.http.SslCertificate;
|
|
||||||
import android.net.http.SslError;
|
|
||||||
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
public class SslErrorTest extends TestCase {
|
|
||||||
private SslCertificate mCertificate;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setUp() throws Exception {
|
|
||||||
super.setUp();
|
|
||||||
mCertificate = new SslCertificate("foo", "bar", new Date(42), new Date(43));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testHasError() {
|
|
||||||
SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate);
|
|
||||||
assertTrue(error.hasError(SslError.SSL_EXPIRED));
|
|
||||||
assertFalse(error.hasError(SslError.SSL_UNTRUSTED));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testAddError() {
|
|
||||||
SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate);
|
|
||||||
assertFalse(error.hasError(SslError.SSL_UNTRUSTED));
|
|
||||||
error.addError(SslError.SSL_UNTRUSTED);
|
|
||||||
assertTrue(error.hasError(SslError.SSL_UNTRUSTED));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testAddErrorIgnoresInvalidValues() {
|
|
||||||
SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate);
|
|
||||||
error.addError(42);
|
|
||||||
assertFalse(error.hasError(42));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testConstructorIgnoresInvalidValues() {
|
|
||||||
SslError error = new SslError(42, mCertificate);
|
|
||||||
assertFalse(error.hasError(42));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetPrimaryError() {
|
|
||||||
SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate);
|
|
||||||
error.addError(SslError.SSL_UNTRUSTED);
|
|
||||||
assertEquals(error.getPrimaryError(), SslError.SSL_UNTRUSTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetPrimaryErrorWithEmptySet() {
|
|
||||||
SslError error = new SslError(42, mCertificate);
|
|
||||||
assertEquals(error.getPrimaryError(), -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetUrl() {
|
|
||||||
SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate, "foo");
|
|
||||||
assertEquals(error.getUrl(), "foo");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetUrlWithDeprecatedConstructor() {
|
|
||||||
SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate);
|
|
||||||
assertEquals(error.getUrl(), "");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetCertificate() {
|
|
||||||
SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate);
|
|
||||||
assertEquals(mCertificate, error.getCertificate());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2012 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package android.net.http.cts;
|
|
||||||
|
|
||||||
import android.net.http.X509TrustManagerExtensions;
|
|
||||||
|
|
||||||
import java.security.KeyStore;
|
|
||||||
import java.security.cert.Certificate;
|
|
||||||
import java.security.cert.X509Certificate;
|
|
||||||
|
|
||||||
import javax.net.ssl.TrustManager;
|
|
||||||
import javax.net.ssl.TrustManagerFactory;
|
|
||||||
import javax.net.ssl.X509TrustManager;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
public class X509TrustManagerExtensionsTest extends TestCase {
|
|
||||||
|
|
||||||
private static X509TrustManager getFirstX509TrustManager(TrustManagerFactory tmf)
|
|
||||||
throws Exception {
|
|
||||||
for (TrustManager trustManager : tmf.getTrustManagers()) {
|
|
||||||
if (trustManager instanceof X509TrustManager) {
|
|
||||||
return (X509TrustManager) trustManager;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fail("Unable to find X509TrustManager");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testIsUserAddedCertificateDefaults() throws Exception {
|
|
||||||
final TrustManagerFactory tmf =
|
|
||||||
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
|
|
||||||
tmf.init((KeyStore) null);
|
|
||||||
X509TrustManager tm = getFirstX509TrustManager(tmf);
|
|
||||||
X509TrustManagerExtensions xtm = new X509TrustManagerExtensions(tm);
|
|
||||||
// Verify that all the default system provided CAs are not marked as user added.
|
|
||||||
for (Certificate cert : tm.getAcceptedIssuers()) {
|
|
||||||
assertFalse(xtm.isUserAddedCertificate((X509Certificate) cert));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,306 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.http.conn.ssl.cts;
|
|
||||||
|
|
||||||
import javax.security.auth.x500.X500Principal;
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
import org.apache.http.conn.ssl.AbstractVerifier;
|
|
||||||
|
|
||||||
import java.lang.Override;
|
|
||||||
import java.math.BigInteger;
|
|
||||||
import java.security.InvalidKeyException;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.security.NoSuchProviderException;
|
|
||||||
import java.security.Principal;
|
|
||||||
import java.security.PublicKey;
|
|
||||||
import java.security.SignatureException;
|
|
||||||
import java.security.cert.CertificateEncodingException;
|
|
||||||
import java.security.cert.CertificateException;
|
|
||||||
import java.security.cert.CertificateExpiredException;
|
|
||||||
import java.security.cert.CertificateNotYetValidException;
|
|
||||||
import java.security.cert.X509Certificate;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See also {@link libcore.javax.security.auth.x500.X500PrincipalTest} as it shows some cases
|
|
||||||
* we are not checking as they are not allowed by the X500 principal in the first place.
|
|
||||||
*/
|
|
||||||
public final class AbstractVerifierTest extends TestCase {
|
|
||||||
|
|
||||||
public void testGetCns() {
|
|
||||||
assertCns("");
|
|
||||||
assertCns("ou=xxx");
|
|
||||||
assertCns("ou=xxx,cn=xxx", "xxx");
|
|
||||||
assertCns("ou=xxx+cn=yyy,cn=zzz+cn=abc", "yyy", "zzz", "abc");
|
|
||||||
assertCns("cn=a,cn=b", "a", "b");
|
|
||||||
assertCns("cn=a c,cn=b", "a c", "b");
|
|
||||||
assertCns("cn=a ,cn=b", "a", "b");
|
|
||||||
assertCns("cn=Cc,cn=Bb,cn=Aa", "Cc", "Bb", "Aa");
|
|
||||||
assertCns("cn=imap.gmail.com", "imap.gmail.com");
|
|
||||||
assertCns("l=\"abcn=a,b\", cn=c", "c");
|
|
||||||
assertCns("l=\"abcn=a,b\", cn=c", "c");
|
|
||||||
assertCns("l=\"abcn=a,b\", cn= c", "c");
|
|
||||||
assertCns("cn=<", "<");
|
|
||||||
assertCns("cn=>", ">");
|
|
||||||
assertCns("cn= >", ">");
|
|
||||||
assertCns("cn=a b", "a b");
|
|
||||||
assertCns("cn =a b", "a b");
|
|
||||||
assertCns("Cn=a b", "a b");
|
|
||||||
assertCns("cN=a b", "a b");
|
|
||||||
assertCns("CN=a b", "a b");
|
|
||||||
assertCns("cn=a#b", "a#b");
|
|
||||||
assertCns("cn=#130161", "a");
|
|
||||||
assertCns("l=q\t+cn=p", "p");
|
|
||||||
assertCns("l=q\n+cn=p", "p");
|
|
||||||
assertCns("l=q\n,cn=p", "p");
|
|
||||||
assertCns("l=,cn=p", "p");
|
|
||||||
assertCns("l=\tq\n,cn=\tp", "\tp");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** A cn=, generates an empty value, unless it's at the very end */
|
|
||||||
public void testEmptyValues() {
|
|
||||||
assertCns("l=,cn=+cn=q", "", "q");
|
|
||||||
assertCns("l=,cn=,cn=q", "", "q");
|
|
||||||
assertCns("l=,cn=");
|
|
||||||
assertCns("l=,cn=q,cn= ", "q");
|
|
||||||
assertCns("l=,cn=q ,cn= ", "q");
|
|
||||||
assertCns("l=,cn=\"\"");
|
|
||||||
assertCns("l=,cn=\" \",cn=\" \"", " ", " ");
|
|
||||||
assertCns("l=,cn= ,cn= ","");
|
|
||||||
assertCns("l=,cn=,cn= ,cn= ", "", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void testGetCns_escapedChars() {
|
|
||||||
assertCns("cn=\\,", ",");
|
|
||||||
assertCns("cn=\\#", "#");
|
|
||||||
assertCns("cn=\\+", "+");
|
|
||||||
assertCns("cn=\\\"", "\"");
|
|
||||||
assertCns("cn=\\\\", "\\");
|
|
||||||
assertCns("cn=\\<", "<");
|
|
||||||
assertCns("cn=\\>", ">");
|
|
||||||
assertCns("cn=\\;", ";");
|
|
||||||
assertCns("cn=\\+", "+");
|
|
||||||
assertCns("cn=\"\\+\"", "+");
|
|
||||||
assertCns("cn=\"\\,\"", ",");
|
|
||||||
assertCns("cn= a =", "a =");
|
|
||||||
assertCns("cn==", "=");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetCns_whitespace() {
|
|
||||||
assertCns("cn= p", "p");
|
|
||||||
assertCns("cn=\np", "p");
|
|
||||||
assertCns("cn=\tp", "\tp");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetCnsWithOid() {
|
|
||||||
assertCns("2.5.4.3=a,ou=xxx", "a");
|
|
||||||
assertCns("2.5.4.3=\" a \",ou=xxx", " a ");
|
|
||||||
assertCns("2.5.5.3=a,ou=xxx,cn=b", "b");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetCnsWithQuotedStrings() {
|
|
||||||
assertCns("cn=\"\\\" a ,=<>#;\"", "\" a ,=<>#;");
|
|
||||||
assertCns("cn=abc\\,def", "abc,def");
|
|
||||||
assertCns("cn=\"\\\" a ,\\=<>\\#;\"", "\" a ,=<>#;");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetCnsWithUtf8() {
|
|
||||||
assertCns("cn=\"Lu\\C4\\8Di\\C4\\87\"", "\u004c\u0075\u010d\u0069\u0107");
|
|
||||||
assertCns("cn=Lu\\C4\\8Di\\C4\\87", "\u004c\u0075\u010d\u0069\u0107");
|
|
||||||
assertCns("cn=Lu\\C4\\8di\\c4\\87", "\u004c\u0075\u010d\u0069\u0107");
|
|
||||||
assertCns("cn=\"Lu\\C4\\8di\\c4\\87\"", "\u004c\u0075\u010d\u0069\u0107");
|
|
||||||
assertCns("cn=\u004c\u0075\u010d\u0069\u0107", "\u004c\u0075\u010d\u0069\u0107");
|
|
||||||
// \63=c
|
|
||||||
assertExceptionInPrincipal("\\63n=ab");
|
|
||||||
assertExceptionInPrincipal("cn=\\a");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetCnsWithWhitespace() {
|
|
||||||
assertCns("ou=a, cn= a b ,o=x", "a b");
|
|
||||||
assertCns("cn=\" a b \" ,o=x", " a b ");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void assertCns(String dn, String... expected) {
|
|
||||||
String[] result = AbstractVerifier.getCNs(createStubCertificate(dn));
|
|
||||||
if (expected.length == 0) {
|
|
||||||
assertNull(result);
|
|
||||||
} else {
|
|
||||||
assertNotNull(dn, result);
|
|
||||||
assertEquals(dn, Arrays.asList(expected), Arrays.asList(result));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void assertExceptionInPrincipal(String dn) {
|
|
||||||
try {
|
|
||||||
X500Principal principal = new X500Principal(dn);
|
|
||||||
fail("Expected " + IllegalArgumentException.class.getName()
|
|
||||||
+ " because of incorrect input name");
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
// Expected.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static X509Certificate createStubCertificate(final String subjectName) {
|
|
||||||
return new X509Certificate() {
|
|
||||||
@Override
|
|
||||||
public X500Principal getSubjectX500Principal() {
|
|
||||||
return new X500Principal(subjectName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set<String> getCriticalExtensionOIDs() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] getExtensionValue(String oid) {
|
|
||||||
return new byte[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set<String> getNonCriticalExtensionOIDs() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasUnsupportedCriticalExtension() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] getEncoded() throws CertificateEncodingException {
|
|
||||||
return new byte[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void verify(PublicKey key)
|
|
||||||
throws CertificateException, NoSuchAlgorithmException, InvalidKeyException,
|
|
||||||
NoSuchProviderException, SignatureException {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void verify(PublicKey key, String sigProvider)
|
|
||||||
throws CertificateException, NoSuchAlgorithmException, InvalidKeyException,
|
|
||||||
NoSuchProviderException, SignatureException {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PublicKey getPublicKey() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void checkValidity()
|
|
||||||
throws CertificateExpiredException, CertificateNotYetValidException {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void checkValidity(Date date)
|
|
||||||
throws CertificateExpiredException, CertificateNotYetValidException {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getVersion() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BigInteger getSerialNumber() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Principal getIssuerDN() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Principal getSubjectDN() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Date getNotBefore() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Date getNotAfter() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] getTBSCertificate() throws CertificateEncodingException {
|
|
||||||
return new byte[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] getSignature() {
|
|
||||||
return new byte[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSigAlgName() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSigAlgOID() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] getSigAlgParams() {
|
|
||||||
return new byte[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean[] getIssuerUniqueID() {
|
|
||||||
return new boolean[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean[] getSubjectUniqueID() {
|
|
||||||
return new boolean[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean[] getKeyUsage() {
|
|
||||||
return new boolean[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getBasicConstraints() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user