|
|
|
|
@ -288,11 +288,11 @@ private void renderX509(StringBuilder sb, X509Certificate certificate)
|
|
|
|
|
addTitle(sb, R.getI18NString("service.gui.CERT_INFO_FINGERPRINTS"));
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
String sha256String = getThumbprint(certificate, "SHA-256");
|
|
|
|
|
String sha1String = getThumbprint(certificate, "SHA1");
|
|
|
|
|
String md5String = getThumbprint(certificate, "MD5");
|
|
|
|
|
|
|
|
|
|
addField(sb, "SHA1:", sha1String);
|
|
|
|
|
addField(sb, "MD5:", md5String);
|
|
|
|
|
addField(sb, "SHA256:", sha256String, 48);
|
|
|
|
|
addField(sb, "SHA1:", sha1String, 32);
|
|
|
|
|
}
|
|
|
|
|
catch (CertificateException e)
|
|
|
|
|
{
|
|
|
|
|
@ -346,11 +346,12 @@ else if(certificate.getPublicKey().getAlgorithm().equals("DSA"))
|
|
|
|
|
|
|
|
|
|
addField(sb, R.getI18NString("service.gui.CERT_INFO_SIGN"),
|
|
|
|
|
R.getI18NString(
|
|
|
|
|
"service.gui.CERT_INFO_KEY_BYTES_PRINT",
|
|
|
|
|
"service.gui.CERT_INFO_KEY_BITS_PRINT",
|
|
|
|
|
new String[]{
|
|
|
|
|
String.valueOf(certificate.getSignature().length),
|
|
|
|
|
getHex(certificate.getSignature())
|
|
|
|
|
String.valueOf(certificate.getSignature().length*8),
|
|
|
|
|
}));
|
|
|
|
|
addField(sb, R.getI18NString("service.gui.CERT_INFO_SIGN"),
|
|
|
|
|
getHex(certificate.getSignature()), 48);
|
|
|
|
|
|
|
|
|
|
sb.append("</table>\n");
|
|
|
|
|
}
|
|
|
|
|
@ -376,12 +377,43 @@ private void addTitle(StringBuilder sb, String title)
|
|
|
|
|
*/
|
|
|
|
|
private void addField(StringBuilder sb, String field, String value)
|
|
|
|
|
{
|
|
|
|
|
sb.append("<tr>")
|
|
|
|
|
.append("<td style='margin-left: 5pt; margin-right: 25pt;")
|
|
|
|
|
.append(" white-space: nowrap'>")
|
|
|
|
|
.append(field).append("</td>")
|
|
|
|
|
.append("<td>").append(value).append("</td>")
|
|
|
|
|
.append("</tr>\n");
|
|
|
|
|
addField(sb, field, value, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Add a field.
|
|
|
|
|
* @param sb StringBuilder to append to
|
|
|
|
|
* @param field name of the certificate field
|
|
|
|
|
* @param value to print
|
|
|
|
|
* @param wrap force-wrap after number of characters
|
|
|
|
|
*/
|
|
|
|
|
private void addField(StringBuilder sb, String field, String value,
|
|
|
|
|
int wrap)
|
|
|
|
|
{
|
|
|
|
|
sb.append("<tr><td style='margin-left: 5pt; margin-right: 25pt;")
|
|
|
|
|
.append("white-space: nowrap' valign='top'>")
|
|
|
|
|
.append(field).append("</td><td");
|
|
|
|
|
|
|
|
|
|
if (wrap > 0)
|
|
|
|
|
{
|
|
|
|
|
sb.append(" style='font-family:monospace'>");
|
|
|
|
|
for (int i = 0; i < value.length(); i++)
|
|
|
|
|
{
|
|
|
|
|
if (i % wrap == 0 && i > 0)
|
|
|
|
|
{
|
|
|
|
|
sb.append("\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sb.append(value.charAt(i));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
sb.append(">");
|
|
|
|
|
sb.append(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sb.append("</td></tr>\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -399,13 +431,13 @@ private String getHex( byte [] raw )
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
for (byte b : raw)
|
|
|
|
|
f.format("%02x", b);
|
|
|
|
|
f.format("%02X:", b);
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
f.close();
|
|
|
|
|
}
|
|
|
|
|
return hex.toString();
|
|
|
|
|
return hex.substring(0, hex.length() - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -429,19 +461,21 @@ private static String getThumbprint(X509Certificate cert, String algorithm)
|
|
|
|
|
{
|
|
|
|
|
throw new CertificateException(e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
byte[] encodedCert = cert.getEncoded();
|
|
|
|
|
StringBuilder sb = new StringBuilder(encodedCert.length * 2);
|
|
|
|
|
Formatter f = new Formatter(sb);
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
for (byte b : digest.digest(encodedCert))
|
|
|
|
|
f.format("%02x", b);
|
|
|
|
|
f.format("%02X:", b);
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
f.close();
|
|
|
|
|
}
|
|
|
|
|
return sb.toString();
|
|
|
|
|
|
|
|
|
|
return sb.substring(0, sb.length() - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|