diff options
-rw-r--r-- | core/java/android/net/http/SslCertificate.java | 175 | ||||
-rw-r--r-- | core/res/res/layout-land/ssl_certificate.xml | 107 | ||||
-rw-r--r-- | core/res/res/layout/ssl_certificate.xml | 429 | ||||
-rwxr-xr-x | core/res/res/values/strings.xml | 8 |
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> |