Merge "wifi: WifiEnterpriseConfig: use ParcelUtil to parcelize key and certificates"

This commit is contained in:
Treehugger Robot
2016-10-06 17:35:32 +00:00
committed by Gerrit Code Review
3 changed files with 82 additions and 88 deletions

View File

@@ -183,48 +183,14 @@ public class WifiEnterpriseConfig implements Parcelable {
dest.writeInt(mEapMethod);
dest.writeInt(mPhase2Method);
writeCertificates(dest, mCaCerts);
if (mClientPrivateKey != null) {
String algorithm = mClientPrivateKey.getAlgorithm();
byte[] userKeyBytes = mClientPrivateKey.getEncoded();
dest.writeInt(userKeyBytes.length);
dest.writeByteArray(userKeyBytes);
dest.writeString(algorithm);
} else {
dest.writeInt(0);
}
writeCertificate(dest, mClientCertificate);
}
private void writeCertificates(Parcel dest, X509Certificate[] cert) {
if (cert != null && cert.length != 0) {
dest.writeInt(cert.length);
for (int i = 0; i < cert.length; i++) {
writeCertificate(dest, cert[i]);
}
} else {
dest.writeInt(0);
}
}
private void writeCertificate(Parcel dest, X509Certificate cert) {
if (cert != null) {
try {
byte[] certBytes = cert.getEncoded();
dest.writeInt(certBytes.length);
dest.writeByteArray(certBytes);
} catch (CertificateEncodingException e) {
dest.writeInt(0);
}
} else {
dest.writeInt(0);
}
ParcelUtil.writeCertificates(dest, mCaCerts);
ParcelUtil.writePrivateKey(dest, mClientPrivateKey);
ParcelUtil.writeCertificate(dest, mClientCertificate);
}
public static final Creator<WifiEnterpriseConfig> CREATOR =
new Creator<WifiEnterpriseConfig>() {
@Override
public WifiEnterpriseConfig createFromParcel(Parcel in) {
WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
int count = in.readInt();
@@ -236,58 +202,13 @@ public class WifiEnterpriseConfig implements Parcelable {
enterpriseConfig.mEapMethod = in.readInt();
enterpriseConfig.mPhase2Method = in.readInt();
enterpriseConfig.mCaCerts = readCertificates(in);
PrivateKey userKey = null;
int len = in.readInt();
if (len > 0) {
try {
byte[] bytes = new byte[len];
in.readByteArray(bytes);
String algorithm = in.readString();
KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
userKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(bytes));
} catch (NoSuchAlgorithmException e) {
userKey = null;
} catch (InvalidKeySpecException e) {
userKey = null;
}
}
enterpriseConfig.mClientPrivateKey = userKey;
enterpriseConfig.mClientCertificate = readCertificate(in);
enterpriseConfig.mCaCerts = ParcelUtil.readCertificates(in);
enterpriseConfig.mClientPrivateKey = ParcelUtil.readPrivateKey(in);
enterpriseConfig.mClientCertificate = ParcelUtil.readCertificate(in);
return enterpriseConfig;
}
private X509Certificate[] readCertificates(Parcel in) {
X509Certificate[] certs = null;
int len = in.readInt();
if (len > 0) {
certs = new X509Certificate[len];
for (int i = 0; i < len; i++) {
certs[i] = readCertificate(in);
}
}
return certs;
}
private X509Certificate readCertificate(Parcel in) {
X509Certificate cert = null;
int len = in.readInt();
if (len > 0) {
try {
byte[] bytes = new byte[len];
in.readByteArray(bytes);
CertificateFactory cFactory = CertificateFactory.getInstance("X.509");
cert = (X509Certificate) cFactory
.generateCertificate(new ByteArrayInputStream(bytes));
} catch (CertificateException e) {
cert = null;
}
}
return cert;
}
@Override
public WifiEnterpriseConfig[] newArray(int size) {
return new WifiEnterpriseConfig[size];
}

View File

@@ -73,6 +73,37 @@ public class FakeKeys {
"-----END CERTIFICATE-----\n";
public static final X509Certificate CA_CERT1 = loadCertificate(CA_CERT1_STRING);
private static final String CLIENT_CERT_STR = "-----BEGIN CERTIFICATE-----\n" +
"MIIE/DCCAuQCAQEwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxCzAJBgNV\n" +
"BAgMAkNBMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdUZXN0aW5n\n" +
"MB4XDTE2MDkzMDIwNTQyOFoXDTE3MDkzMDIwNTQyOFowRDELMAkGA1UEBhMCVVMx\n" +
"CzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdU\n" +
"ZXN0aW5nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnpmcbuaeHfnJ\n" +
"k+2QNvxmdVFTawyFMNk0USCq5sexscwmxbewG/Rb8YnixwJWS44v2XkSujB67z5C\n" +
"s2qudFEhRXKdEuC6idbAuA97KjipHh0AAniWMsyv61fvbgsUC0b0canx3LiDq81p\n" +
"y28NNGmAvoazLZUZ4AhBRiwYZY6FKk723gmZoGbEIeG7J1dlXPusc1662rIjz4eU\n" +
"zlmmlvqyHfNqnNk8L14Vug6Xh+lOEGN85xhu1YHAEKGrS89kZxs5rum/cZU8KH2V\n" +
"v6eKnY03kxjiVLQtnLpm/7VUEoCMGHyruRj+p3my4+DgqMsmsH52RZCBsjyGlpbU\n" +
"NOwOTIX6xh+Rqloduz4AnrMYYIiIw2s8g+2zJM7VbcVKx0fGS26BKdrxgrXWfmNE\n" +
"nR0/REQ5AxDGw0jfTUvtdTkXAf+K4MDjcNLEZ+MA4rHfAfQWZtUR5BkHCQYxNpJk\n" +
"pA0gyk+BpKdC4WdzI14NSWsu5sRCmBCFqH6BTOSEq/V1cNorBxNwLSSTwFFqUDqx\n" +
"Y5nQLXygkJf9WHZWtSKeSjtOYgilz7UKzC2s3CsjmIyGFe+SwpuHJnuE4Uc8Z5Cb\n" +
"bjNGHPzqL6XnmzZHJp7RF8kBdKdjGC7dCUltzOfICZeKlzOOq+Kw42T/nXjuXvpb\n" +
"nkXNxg741Nwd6RecykXJbseFwm3EYxkCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEA\n" +
"Ga1mGwI9aXkL2fTPXO9YkAPzoGeX8aeuVYSQaSkNq+5vnogYCyAt3YDHjRG+ewTT\n" +
"WbnPA991xRAPac+biJeXWmwvgGj0YuT7e79phAiGkTTnbAjFHGfYnBy/tI/v7btO\n" +
"hRNElA5yTJ1m2fVbBEKXzMR83jrT9iyI+YLRN86zUZIaC86xxSbqnrdWN2jOK6MX\n" +
"dS8Arp9tPQjC/4gW+2Ilxv68jiYh+5auWHQZVjppWVY//iu4mAbkq1pTwQEhZ8F8\n" +
"Zrmh9DHh60hLFcfSuhIAwf/NMzppwdkjy1ruKVrpijhGKGp4OWu8nvOUgHSzxc7F\n" +
"PwpVZ5N2Ku4L8MLO6BG2VasRJK7l17TzDXlfLZHJjkuryOFxVaQKt8ZNFgTOaCXS\n" +
"E+gpTLksKU7riYckoiP4+H1sn9qcis0e8s4o/uf1UVc8GSdDw61ReGM5oZEDm1u8\n" +
"H9x20QU6igLqzyBpqvCKv7JNgU1uB2PAODHH78zJiUfnKd1y+o+J1iWzaGj3EFji\n" +
"T8AXksbTP733FeFXfggXju2dyBH+Z1S5BBTEOd1brWgXlHSAZGm97MKZ94r6/tkX\n" +
"qfv3fCos0DKz0oV7qBxYS8wiYhzrRVxG6ITAoH8uuUVVQaZF+G4nJ2jEqNbfuKyX\n" +
"ATQsVNjNNlDA0J33GobPMjT326wa4YAWMx8PI5PJZ3g=\n" +
"-----END CERTIFICATE-----\n";
public static final X509Certificate CLIENT_CERT = loadCertificate(CLIENT_CERT_STR);
private static final byte[] FAKE_RSA_KEY_1 = new byte[] {
(byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x78, (byte) 0x02, (byte) 0x01,
(byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,

View File

@@ -16,10 +16,12 @@
package android.net.wifi;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.net.wifi.WifiEnterpriseConfig.Eap;
import android.net.wifi.WifiEnterpriseConfig.Phase2;
@@ -30,6 +32,7 @@ import android.test.suitebuilder.annotation.SmallTest;
import org.junit.Before;
import org.junit.Test;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
@@ -259,6 +262,45 @@ public class WifiEnterpriseConfigTest {
assertEquals("\"autheap=GTC\"", getSupplicantPhase2Method());
}
/**
* Verifies that parceling a WifiEnterpriseConfig preserves the key
* and certificates information.
*/
@Test
public void parcelConfigWithKeyAndCerts() throws Exception {
WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
PrivateKey clientKey = FakeKeys.RSA_KEY1;
X509Certificate clientCert = FakeKeys.CLIENT_CERT;
X509Certificate[] caCerts = new X509Certificate[] {FakeKeys.CA_CERT0, FakeKeys.CA_CERT1};
enterpriseConfig.setClientKeyEntry(clientKey, clientCert);
enterpriseConfig.setCaCertificates(caCerts);
Parcel parcel = Parcel.obtain();
enterpriseConfig.writeToParcel(parcel, 0);
parcel.setDataPosition(0); // Allow parcel to be read from the beginning.
mEnterpriseConfig = WifiEnterpriseConfig.CREATOR.createFromParcel(parcel);
PrivateKey actualClientKey = mEnterpriseConfig.getClientPrivateKey();
X509Certificate actualClientCert = mEnterpriseConfig.getClientCertificate();
X509Certificate[] actualCaCerts = mEnterpriseConfig.getCaCertificates();
/* Verify client private key. */
assertNotNull(actualClientKey);
assertEquals(clientKey.getAlgorithm(), actualClientKey.getAlgorithm());
assertArrayEquals(clientKey.getEncoded(), actualClientKey.getEncoded());
/* Verify client certificate. */
assertNotNull(actualClientCert);
assertArrayEquals(clientCert.getEncoded(), actualClientCert.getEncoded());
/* Verify CA certificates. */
assertNotNull(actualCaCerts);
assertEquals(caCerts.length, actualCaCerts.length);
for (int i = 0; i < caCerts.length; i++) {
assertNotNull(actualCaCerts[i]);
assertArrayEquals(caCerts[i].getEncoded(), actualCaCerts[i].getEncoded());
}
}
/** Verifies proper operation of the getKeyId() method. */
@Test
public void getKeyId() {