summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/net/http/SslCertificate.java175
-rw-r--r--core/res/res/layout-land/ssl_certificate.xml107
-rw-r--r--core/res/res/layout/ssl_certificate.xml429
-rwxr-xr-xcore/res/res/values/strings.xml8
4 files changed, 459 insertions, 260 deletions
diff --git a/core/java/android/net/http/SslCertificate.java b/core/java/android/net/http/SslCertificate.java
index f35002a..fe6d4eb 100644
--- a/core/java/android/net/http/SslCertificate.java
+++ b/core/java/android/net/http/SslCertificate.java
@@ -23,13 +23,20 @@ import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
+import java.io.ByteArrayInputStream;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;
-import com.android.org.bouncycastle.asn1.DERObjectIdentifier;
import com.android.org.bouncycastle.asn1.x509.X509Name;
/**
@@ -45,22 +52,31 @@ public class SslCertificate {
/**
* Name of the entity this certificate is issued to
*/
- private DName mIssuedTo;
+ private final DName mIssuedTo;
/**
* Name of the entity this certificate is issued by
*/
- private DName mIssuedBy;
+ private final DName mIssuedBy;
/**
* Not-before date from the validity period
*/
- private Date mValidNotBefore;
+ private final Date mValidNotBefore;
/**
* Not-after date from the validity period
*/
- private Date mValidNotAfter;
+ private final Date mValidNotAfter;
+
+ /**
+ * The original source certificate, if available.
+ *
+ * TODO If deprecated constructors are removed, this should always
+ * be available, and saveState and restoreState can be simplified
+ * to be unconditional.
+ */
+ private final X509Certificate mX509Certificate;
/**
* Bundle key names
@@ -69,6 +85,7 @@ public class SslCertificate {
private static final String ISSUED_BY = "issued-by";
private static final String VALID_NOT_BEFORE = "valid-not-before";
private static final String VALID_NOT_AFTER = "valid-not-after";
+ private static final String X509_CERTIFICATE = "x509-certificate";
/**
* Saves the certificate state to a bundle
@@ -76,18 +93,21 @@ public class SslCertificate {
* @return A bundle with the certificate stored in it or null if fails
*/
public static Bundle saveState(SslCertificate certificate) {
- Bundle bundle = null;
-
- if (certificate != null) {
- bundle = new Bundle();
-
- bundle.putString(ISSUED_TO, certificate.getIssuedTo().getDName());
- bundle.putString(ISSUED_BY, certificate.getIssuedBy().getDName());
-
- bundle.putString(VALID_NOT_BEFORE, certificate.getValidNotBefore());
- bundle.putString(VALID_NOT_AFTER, certificate.getValidNotAfter());
+ if (certificate == null) {
+ return null;
+ }
+ Bundle bundle = new Bundle();
+ bundle.putString(ISSUED_TO, certificate.getIssuedTo().getDName());
+ bundle.putString(ISSUED_BY, certificate.getIssuedBy().getDName());
+ bundle.putString(VALID_NOT_BEFORE, certificate.getValidNotBefore());
+ bundle.putString(VALID_NOT_AFTER, certificate.getValidNotAfter());
+ X509Certificate x509Certificate = certificate.mX509Certificate;
+ if (x509Certificate != null) {
+ try {
+ bundle.putByteArray(X509_CERTIFICATE, x509Certificate.getEncoded());
+ } catch (CertificateEncodingException ignored) {
+ }
}
-
return bundle;
}
@@ -97,15 +117,27 @@ public class SslCertificate {
* @return The SSL certificate stored in the bundle or null if fails
*/
public static SslCertificate restoreState(Bundle bundle) {
- if (bundle != null) {
- return new SslCertificate(
- bundle.getString(ISSUED_TO),
- bundle.getString(ISSUED_BY),
- bundle.getString(VALID_NOT_BEFORE),
- bundle.getString(VALID_NOT_AFTER));
+ if (bundle == null) {
+ return null;
}
-
- return null;
+ X509Certificate x509Certificate;
+ byte[] bytes = bundle.getByteArray(X509_CERTIFICATE);
+ if (bytes == null) {
+ x509Certificate = null;
+ } else {
+ try {
+ CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+ Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes));
+ x509Certificate = (X509Certificate) cert;
+ } catch (CertificateException e) {
+ x509Certificate = null;
+ }
+ }
+ return new SslCertificate(bundle.getString(ISSUED_TO),
+ bundle.getString(ISSUED_BY),
+ parseDate(bundle.getString(VALID_NOT_BEFORE)),
+ parseDate(bundle.getString(VALID_NOT_AFTER)),
+ x509Certificate);
}
/**
@@ -121,7 +153,7 @@ public class SslCertificate {
@Deprecated
public SslCertificate(
String issuedTo, String issuedBy, String validNotBefore, String validNotAfter) {
- this(issuedTo, issuedBy, parseDate(validNotBefore), parseDate(validNotAfter));
+ this(issuedTo, issuedBy, parseDate(validNotBefore), parseDate(validNotAfter), null);
}
/**
@@ -135,10 +167,7 @@ public class SslCertificate {
@Deprecated
public SslCertificate(
String issuedTo, String issuedBy, Date validNotBefore, Date validNotAfter) {
- mIssuedTo = new DName(issuedTo);
- mIssuedBy = new DName(issuedBy);
- mValidNotBefore = cloneDate(validNotBefore);
- mValidNotAfter = cloneDate(validNotAfter);
+ this(issuedTo, issuedBy, validNotBefore, validNotAfter, null);
}
/**
@@ -149,7 +178,19 @@ public class SslCertificate {
this(certificate.getSubjectDN().getName(),
certificate.getIssuerDN().getName(),
certificate.getNotBefore(),
- certificate.getNotAfter());
+ certificate.getNotAfter(),
+ certificate);
+ }
+
+ private SslCertificate(
+ String issuedTo, String issuedBy,
+ Date validNotBefore, Date validNotAfter,
+ X509Certificate x509Certificate) {
+ mIssuedTo = new DName(issuedTo);
+ mIssuedBy = new DName(issuedBy);
+ mValidNotBefore = cloneDate(validNotBefore);
+ mValidNotAfter = cloneDate(validNotAfter);
+ mX509Certificate = x509Certificate;
}
/**
@@ -205,6 +246,54 @@ public class SslCertificate {
}
/**
+ * Convenience for UI presentation, not intended as public API.
+ */
+ private static String getSerialNumber(X509Certificate x509Certificate) {
+ if (x509Certificate == null) {
+ return "";
+ }
+ BigInteger serialNumber = x509Certificate.getSerialNumber();
+ if (serialNumber == null) {
+ return "";
+ }
+ return fingerprint(serialNumber.toByteArray());
+ }
+
+ /**
+ * Convenience for UI presentation, not intended as public API.
+ */
+ private static String getDigest(X509Certificate x509Certificate, String algorithm) {
+ if (x509Certificate == null) {
+ return "";
+ }
+ try {
+ byte[] bytes = x509Certificate.getEncoded();
+ MessageDigest md = MessageDigest.getInstance(algorithm);
+ byte[] digest = md.digest(bytes);
+ return fingerprint(digest);
+ } catch (CertificateEncodingException ignored) {
+ return "";
+ } catch (NoSuchAlgorithmException ignored) {
+ return "";
+ }
+ }
+
+ private static final String fingerprint(byte[] bytes) {
+ if (bytes == null) {
+ return "";
+ }
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < bytes.length; i++) {
+ byte b = bytes[i];
+ IntegralToString.appendByteAsHex(sb, b, true);
+ if (i+1 != bytes.length) {
+ sb.append(':');
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
* @return A string representation of this certificate for debugging
*/
public String toString() {
@@ -338,7 +427,6 @@ public class SslCertificate {
* Inflates the SSL certificate view (helper method).
* @return The resultant certificate view with issued-to, issued-by,
* issued-on, expires-on, and possibly other fields set.
- * If the input certificate is null, returns null.
*
* @hide Used by Browser and Settings
*/
@@ -352,33 +440,42 @@ public class SslCertificate {
SslCertificate.DName issuedTo = getIssuedTo();
if (issuedTo != null) {
((TextView) certificateView.findViewById(com.android.internal.R.id.to_common))
- .setText(issuedTo.getCName());
+ .setText(issuedTo.getCName());
((TextView) certificateView.findViewById(com.android.internal.R.id.to_org))
- .setText(issuedTo.getOName());
+ .setText(issuedTo.getOName());
((TextView) certificateView.findViewById(com.android.internal.R.id.to_org_unit))
- .setText(issuedTo.getUName());
+ .setText(issuedTo.getUName());
}
+ // serial number:
+ ((TextView) certificateView.findViewById(com.android.internal.R.id.serial_number))
+ .setText(getSerialNumber(mX509Certificate));
// issued by:
SslCertificate.DName issuedBy = getIssuedBy();
if (issuedBy != null) {
((TextView) certificateView.findViewById(com.android.internal.R.id.by_common))
- .setText(issuedBy.getCName());
+ .setText(issuedBy.getCName());
((TextView) certificateView.findViewById(com.android.internal.R.id.by_org))
- .setText(issuedBy.getOName());
+ .setText(issuedBy.getOName());
((TextView) certificateView.findViewById(com.android.internal.R.id.by_org_unit))
- .setText(issuedBy.getUName());
+ .setText(issuedBy.getUName());
}
// issued on:
String issuedOn = formatCertificateDate(context, getValidNotBeforeDate());
((TextView) certificateView.findViewById(com.android.internal.R.id.issued_on))
- .setText(issuedOn);
+ .setText(issuedOn);
// expires on:
String expiresOn = formatCertificateDate(context, getValidNotAfterDate());
((TextView) certificateView.findViewById(com.android.internal.R.id.expires_on))
- .setText(expiresOn);
+ .setText(expiresOn);
+
+ // fingerprints:
+ ((TextView) certificateView.findViewById(com.android.internal.R.id.sha256_fingerprint))
+ .setText(getDigest(mX509Certificate, "SHA256"));
+ ((TextView) certificateView.findViewById(com.android.internal.R.id.sha1_fingerprint))
+ .setText(getDigest(mX509Certificate, "SHA1"));
return certificateView;
}
diff --git a/core/res/res/layout-land/ssl_certificate.xml b/core/res/res/layout-land/ssl_certificate.xml
index c3e6deb..4f8bd8e 100644
--- a/core/res/res/layout-land/ssl_certificate.xml
+++ b/core/res/res/layout-land/ssl_certificate.xml
@@ -23,6 +23,7 @@
android:id="@+id/body"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:gravity="left"
android:orientation="vertical" >
<!-- Placeholder for the success message or one or more warnings -->
@@ -43,8 +44,7 @@
android:layout_weight="1"
android:gravity="fill_horizontal"
android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="12dip" />
+ android:layout_marginRight="20dip"/>
<TableLayout
android:layout_width="match_parent"
@@ -58,7 +58,8 @@
android:text="@string/issued_to"
android:textStyle="bold"
android:layout_height="wrap_content"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginTop="12dip"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="7dip" />
@@ -68,12 +69,10 @@
<TextView
android:id="@+id/to_common_header"
android:text="@string/common_name"
- android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/to_common"
- android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="7dip" />
@@ -84,12 +83,10 @@
<TextView
android:id="@+id/to_org_header"
android:text="@string/org_name"
- android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/to_org"
- android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="7dip" />
@@ -100,15 +97,27 @@
<TextView
android:id="@+id/to_org_unit_header"
android:text="@string/org_unit"
- android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/to_org_unit"
- android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
- android:layout_marginBottom="12dip" />
+ android:layout_marginBottom="7dip" />
+ </TableRow>
+
+ <!-- Serial number: -->
+ <TableRow>
+ <TextView
+ android:id="@+id/serial_number_header"
+ android:text="@string/serial_number"
+ android:layout_marginLeft="20dip" />
+
+ <TextView
+ android:id="@+id/serial_number"
+ android:layout_marginLeft="10dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
</TableRow>
<!-- Issued by: -->
@@ -117,7 +126,8 @@
android:text="@string/issued_by"
android:textStyle="bold"
android:layout_height="wrap_content"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginTop="12dip"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="7dip" />
@@ -127,12 +137,10 @@
<TextView
android:id="@+id/by_common_header"
android:text="@string/common_name"
- android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/by_common"
- android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="7dip" />
@@ -143,12 +151,10 @@
<TextView
android:id="@+id/by_org_header"
android:text="@string/org_name"
- android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/by_org"
- android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="7dip" />
@@ -159,24 +165,23 @@
<TextView
android:id="@+id/by_org_unit_header"
android:text="@string/org_unit"
- android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/by_org_unit"
- android:gravity="left"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
- android:layout_marginBottom="12dip" />
+ android:layout_marginBottom="7dip" />
</TableRow>
<!-- Validity Dates: -->
<TextView
android:id="@+id/validity_header"
android:layout_height="wrap_content"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:text="@string/validity_period"
android:textStyle="bold"
+ android:layout_marginTop="12dip"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="7dip" />
@@ -185,17 +190,15 @@
<TableRow>
<TextView
android:id="@+id/issued_on_header"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/issued_on"
- android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/issued_on"
android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="left"
+ android:layout_width="match_parent"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="7dip" />
@@ -206,20 +209,68 @@
<TableRow>
<TextView
android:id="@+id/expires_on_header"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/expires_on"
- android:gravity="left"
android:layout_marginLeft="20dip" />
<TextView
android:id="@+id/expires_on"
android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="left"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="10dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+ </TableRow>
+
+ <!-- Fingerprints: -->
+ <TextView
+ android:id="@+id/fingerprints"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:text="@string/fingerprints"
+ android:textStyle="bold"
+ android:layout_marginTop="12dip"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- SHA-256 fingerprint: -->
+ <TableRow>
+ <TextView
+ android:id="@+id/sha256_fingerprint_header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sha256_fingerprint"
+ android:layout_marginLeft="20dip" />
+
+ <TextView
+ android:id="@+id/sha256_fingerprint"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
android:layout_marginLeft="10dip"
android:layout_marginRight="20dip"
- android:layout_marginBottom="12dip" />
+ android:layout_marginBottom="7dip" />
+
+ </TableRow>
+
+ <!-- SHA-1 fingerprint: -->
+ <TableRow>
+ <TextView
+ android:id="@+id/sha1_fingerprint_header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sha1_fingerprint"
+ android:layout_marginLeft="20dip" />
+
+ <TextView
+ android:id="@+id/sha1_fingerprint"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="10dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
</TableRow>
</TableLayout>
diff --git a/core/res/res/layout/ssl_certificate.xml b/core/res/res/layout/ssl_certificate.xml
index ae661ce..dd89a2d 100644
--- a/core/res/res/layout/ssl_certificate.xml
+++ b/core/res/res/layout/ssl_certificate.xml
@@ -23,6 +23,7 @@
android:id="@+id/body"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:gravity="left"
android:orientation="vertical" >
<!-- Placeholder for the success message or one or more warnings -->
@@ -43,200 +44,242 @@
android:layout_weight="1"
android:gravity="fill_horizontal"
android:layout_marginRight="20dip"
+ android:layout_marginLeft="20dip"/>
+
+ <!-- Issued to: -->
+ <TextView
+ android:id="@+id/issued_to_header"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:text="@string/issued_to"
+ android:textStyle="bold"
+ android:layout_marginTop="12dip"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Common name: -->
+ <TextView
+ android:id="@+id/to_common_header"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:text="@string/common_name"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip" />
+
+ <TextView
+ android:id="@+id/to_common"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Organization: -->
+ <TextView
+ android:id="@+id/to_org_header"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:text="@string/org_name"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip" />
+
+ <TextView
+ android:id="@+id/to_org"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Organizational unit: -->
+ <TextView
+ android:id="@+id/to_org_unit_header"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:text="@string/org_unit"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip" />
+
+ <TextView
+ android:id="@+id/to_org_unit"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Serial number: -->
+ <TextView
+ android:id="@+id/serial_number_header"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:text="@string/serial_number"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip" />
+
+ <TextView
+ android:id="@+id/serial_number"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Issued by: -->
+ <TextView
+ android:id="@+id/issued_to_header"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:text="@string/issued_by"
+ android:textStyle="bold"
+ android:layout_marginTop="12dip"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Common name: -->
+ <TextView
+ android:id="@+id/by_common_header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/common_name"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip" />
+
+ <TextView
+ android:id="@+id/by_common"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Organization: -->
+ <TextView
+ android:id="@+id/by_org_header"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:text="@string/org_name"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip" />
+
+ <TextView
+ android:id="@+id/by_org"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Organizational unit: -->
+ <TextView
+ android:id="@+id/by_org_unit_header"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:text="@string/org_unit"
android:layout_marginLeft="20dip"
- android:layout_marginBottom="12dip" />
-
- <TableLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
-
- <!-- Issued to: -->
- <TextView
- android:id="@+id/issued_to_header"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:text="@string/issued_to"
- android:textStyle="bold"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="10dip" />
-
- <!-- Common name: -->
- <TextView
- android:id="@+id/to_common_header"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:text="@string/common_name"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip" />
-
- <TextView
- android:id="@+id/to_common"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="10dip" />
-
- <!-- Organization: -->
- <TextView
- android:id="@+id/to_org_header"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:text="@string/org_name"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip" />
-
- <TextView
- android:id="@+id/to_org"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="10dip" />
-
- <!-- Organizational unit: -->
- <TextView
- android:id="@+id/to_org_unit_header"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:text="@string/org_unit"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip" />
-
- <TextView
- android:id="@+id/to_org_unit"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="12dip" />
-
- <!-- Issued by: -->
- <TextView
- android:id="@+id/issued_to_header"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:text="@string/issued_by"
- android:textStyle="bold"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="10dip" />
-
- <!-- Common name: -->
- <TextView
- android:id="@+id/by_common_header"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/common_name"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip" />
-
- <TextView
- android:id="@+id/by_common"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="10dip" />
-
- <!-- Organization: -->
- <TextView
- android:id="@+id/by_org_header"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:text="@string/org_name"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip" />
-
- <TextView
- android:id="@+id/by_org"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="10dip" />
-
- <!-- Organizational unit: -->
- <TextView
- android:id="@+id/by_org_unit_header"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:text="@string/org_unit"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip" />
-
- <TextView
- android:id="@+id/by_org_unit"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="12dip" />
-
- <!-- Validity Dates: -->
- <TextView
- android:id="@+id/validity_header"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:text="@string/validity_period"
- android:textStyle="bold"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="10dip" />
-
- <!-- Issued On: -->
- <TextView
- android:id="@+id/issued_on_header"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/issued_on"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip" />
-
- <TextView
- android:id="@+id/issued_on"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="10dip" />
-
- <!-- Expires On: -->
- <TextView
- android:id="@+id/expires_on_header"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/expires_on"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip" />
-
- <TextView
- android:id="@+id/expires_on"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:gravity="left"
- android:layout_marginLeft="20dip"
- android:layout_marginRight="20dip"
- android:layout_marginBottom="12dip" />
-
- </TableLayout>
+ android:layout_marginRight="20dip" />
+
+ <TextView
+ android:id="@+id/by_org_unit"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Validity Dates: -->
+ <TextView
+ android:id="@+id/validity_header"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:text="@string/validity_period"
+ android:textStyle="bold"
+ android:layout_marginTop="12dip"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Issued On: -->
+ <TextView
+ android:id="@+id/issued_on_header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/issued_on"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip" />
+
+ <TextView
+ android:id="@+id/issued_on"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Expires On: -->
+ <TextView
+ android:id="@+id/expires_on_header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/expires_on"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip" />
+
+ <TextView
+ android:id="@+id/expires_on"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- Fingerprints: -->
+ <TextView
+ android:id="@+id/fingerprints"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:text="@string/fingerprints"
+ android:textStyle="bold"
+ android:layout_marginTop="12dip"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- SHA-256 fingerprint: -->
+ <TextView
+ android:id="@+id/sha256_fingerprint_header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sha256_fingerprint"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip" />
+
+ <TextView
+ android:id="@+id/sha256_fingerprint"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
+
+ <!-- SHA-1 fingerprint: -->
+ <TextView
+ android:id="@+id/sha1_fingerprint_header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sha1_fingerprint"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip" />
+
+ <TextView
+ android:id="@+id/sha1_fingerprint"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:layout_marginBottom="7dip" />
</LinearLayout>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 9897c80..50f8df7 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2989,6 +2989,14 @@
<string name="issued_on">Issued on:</string>
<!-- Label for an information field on an SSL Certificate Dialog -->
<string name="expires_on">Expires on:</string>
+ <!-- Label for an information field on an SSL Certificate Dialog -->
+ <string name="serial_number">Serial number:</string>
+ <!-- Label for an information field on an SSL Certificate Dialog -->
+ <string name="fingerprints">Fingerprints:</string>
+ <!-- Label for an information field on an SSL Certificate Dialog -->
+ <string name="sha256_fingerprint">SHA-256 fingerprint:</string>
+ <!-- Label for an information field on an SSL Certificate Dialog -->
+ <string name="sha1_fingerprint">SHA-1 fingerprint:</string>
<!-- Title for a button to expand the list of activities in ActivityChooserView [CHAR LIMIT=25] -->
<string name="activity_chooser_view_see_all">See all...</string>